所以这是一个似乎没有官方答案的问题。至少我一个也找不到。
情况:如果我有一个双向的一对多关联并且我希望 orphanRemoval=true 采取行动,我现在是否必须从关联的双方删除关联,或者通过删除来“破坏”关联就足够了其中一个实体中的引用(相反)?
例子:
class Parent {
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
List<Child> children;
public void addChild(Child child) {
child.setParent(this);
children.add(child);
}
public void removeChild(Child child){
//both statements neccessary or just one? Does it matter which one?
children.remove(child);
if (child != null) {
child.setParent(null);
}
}
}
class Child {
String name;
@ManyToOne
@JoinColumn(name="parentID")
Parent parent;
public void setParent(Parent p) {
[...]
}
}
我在我的书“Mike Keith 的 Pro JPA 2”(第 2 版,第 287 页)中遇到了这个解释:
当指定时,orphanRemoval 元素会导致在父子实体之间的关系被破坏时删除子实体。这可以通过将包含相关实体的属性设置为 null 来完成,或者在一对多的情况下通过从集合中删除子实体来完成。然后,提供者负责在刷新或提交时间(以先到者为准)删除孤立的子实体。在父子关系中,孩子依赖于父母的存在。如果父母被移除,那么根据定义,孩子成为孤儿,也必须被移除。
然后是那些同时做这两个的帖子:
- https://stackoverflow.com/a/23926548
- https://stackoverflow.com/a/3071125
- https://coderanch.com/t/652044/databases/Delete-Bidirectional-Entities#3012875
我的问题:
1)什么是正确的/现在需要两者中的哪一个?
2) 如果 Child 类有一个 @JoinColumn(name="parentID", nullable=false ) 并且它的父引用将设置为 null 会发生什么,如上所示?我的猜测:orphanRemoval 将在稍后发生,并且基于数据库中的值,所以直到 Child 实体被更新。但是由于 nullable=false,该更新不会发生,对吧?