JPA:Cascade remove不删除子级
编辑:修改问题以更好地反映问题。最初发布的问题 我有一个父(JPA:Cascade remove不删除子级,jpa,cascade,Jpa,Cascade,编辑:修改问题以更好地反映问题。最初发布的问题 我有一个父(Context)和一个子(User)实体(manytone关系)。父级上的级联“删除”未删除子级。代码如下: //Owning side - child @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @Column(name = DBColumns.USER_N
Context
)和一个子(User
)实体(manytone关系)。父级上的级联“删除”未删除子级。代码如下:
//Owning side - child
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = DBColumns.USER_NAME)
private String name;
@ManyToOne
@JoinColumn(name = DBColumns.CONTEXT_ID)
private Context context;
}
//parent
@Entity
public class Context {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = DBColumns.CONTEXT_NAME)
private String name;
@OneToMany(mappedBy = "context", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE, orphanRemoval = true)
private Set<User> users = new HashSet<User>();
}
//usage
Context sampleContext = new Context("sampleContext");
em.persist(sampleContext);
User sampleUser = new User(sampleContext, "sampleUser");
em.persist(sampleUser);
em.remove(sampleContext); //should remove user as well but throws foreign key dependency error
//拥有方-子
@实体
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
@列(name=DBColumns.USER\u name)
私有字符串名称;
@许多酮
@JoinColumn(name=DBColumns.CONTEXT\u ID)
私人语境;
}
//母公司
@实体
公共类上下文{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
@列(name=DBColumns.CONTEXT\u name)
私有字符串名称;
@OneToMany(mappedBy=“context”,fetch=FetchType.LAZY,cascade=CascadeType.REMOVE,orphanremove=true)
private Set users=new HashSet();
}
//用法
上下文sampleContext=新上下文(“sampleContext”);
em.persist(sampleContext);
用户sampleUser=新用户(sampleContext,“sampleUser”);
em.persist(sampleUser);
em.remove(sampleContext)//也应该删除用户,但抛出外键依赖项错误
不要将关系表映射为en实体。改为使用@ManyToMany
,并使您的用户实体成为关系的所有者
编辑:
因此,您的关联表主键必须由两个外键组成
请参见此您正在对sampleUser not sampleContext调用remove(),并且用户不会将remove级联到上下文,因此您应该只看到正在删除的用户
如果对sampleContext调用remove(),还必须确保在创建用户时将该用户添加到上下文的用户中。您很可能只设置了用户的conext。在删除实体之前,我需要刷新实体:
em.refresh(sampleContext);
em.remove(sampleContext);
之前,被删除的实体(
sampleContext
)不知道sampleUser
与之关联(可能是因为sampleContext
是从缓存中提取的)。在delete
之前执行refresh
可确保从数据库中更新实体。我希望将其分开,以便以后可以使用字符串而不是直接实体指定映射(以方便正则表达式)。例如,我想通过映射user:role::*:employee
,说“所有用户
都属于员工
角色”。谢谢链接。它提供了信息。然而,我也有很多人际关系的问题。编辑问题以使问题更清楚。更正了打字错误。它必须是remove(sampleContext)
。此解决方案有效。但是,不需要手动将用户
添加到上下文
的用户中。JPA自己做这件事。顺便说一下,我只需要刷新上下文
,然后删除它(这样它的用户
就可以从数据库中更新了)。如果指定orphanRemoving=true,则无需添加CascadeType.REMOVE。(见JSR338第2.9节)