我的数据模型中有两个名为 User 和 UserProfile 的实体。以下是它们的映射方式。
来自用户实体的代码:
@OneToOne(cascade=CascadeType.ALL)
@PrimaryKeyJoinColumn
public UserProfile getUserProfile(){
return this.userProfile;
}
public void setUserProfile(UserProfile userProfile){
this.userProfile=userProfile;
}
来自 UserProfile 实体的代码:
@OneToOne(mappedBy="userProfile",cascade=CascadeType.ALL)
public User getUser(){
return this.user;
}
public void setUser(User user){
this.user=user;
}
如你所见,我有一个CascadeType.ALL
用于 UserProfile 中的用户属性。但是当我尝试删除 UserProfile 实体时,相应的 User 实体仍然保留。 (当我尝试删除 User 实体时,相应的 UserProfile 实体将被删除。)
这是我的问题:-
- 仅当我在拥有关系的实体上指定级联时,级联才有效吗?
你的问题本身就是错误的,这就是所有混乱的根源。亚瑟的回答做得很好,但从评论中可以清楚地看出,困惑仍然存在,所以让我在这里尝试一下。
仅当我指定时级联才保持
他们在拥有的实体上
关系?
“级联”是您在关系的一端(或在双向的情况下可能是两端)指定的属性。它决定什么actions执行于that结束将被传播到other结尾。有许多不同类型 http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#entity-mapping-association-cascadeJPA 中定义的那些操作和更 http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#entity-hibspec-cascade在 Hibernate 扩展中定义。这个区别很重要——你应该只谈论specific行为正在传播,而不是一般的“级联”。
PERSIST、MERGE、REFRESH 正常传播(从声明的一端到另一端)。
然而,REMOVE 很棘手,因为它可能意味着两种不同的东西。如果你们之间有关系A and B并且您正在尝试删除A,您可以删除B在另一端或者您可以删除协会但离开B完好无损的。
Hibernate 对两者做了明确的区分——你可以声明 REMOVE (DELETE) 和DELETE_ORPHAN
分别级联类型; JPA 规范没有。注意DELETE_ORPHAN
不支持单值关系(OneToOne / ManyToOne)。
因此,REMOVE 的传播(单独或当它是 ALL 的一部分时)取决于关系是否有明确的所有者(单向总是有;如果使用映射则双向有)mappedBy如果通过映射则不会连接表)在这种情况下,它从所有者传播到拥有者,或者没有所有者,在这种情况下,它向任一方向传播,但没有DELETE_ORPHAN
语义,除非明确指定。后者的典型例子是双向多对多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)