这是一个似乎没有官方答案的问题。至少我找不到一个。
情况:如果我有一个双向的一对多关联,并且我希望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) {
[...]
}
}
我在我的书中发现了这个解释&#34; Mike JP的Pro JPA 2&#34; (第2版,第287页):
当指定时,orphanRemoval元素会导致在父元素与子元素之间的关系被破坏时删除子实体。 这可以通过将包含该属性的属性设置为null来完成 通过从集合中删除子实体,在一对多的情况下,相关实体或。然后,提供者在刷新或提交时(以先到者为准)负责删除孤立子实体。 在亲子关系中,孩子依赖于父母的存在。如果父母被删除, 然后根据定义,孩子成为一个孤儿,也必须被移除。
然后有些帖子同时执行这两个帖子:
我的问题:
1)现在需要哪些正确/哪一个是必要的?
2)如果Child类有一个,会发生什么 @JoinColumn(name =&#34; parentID&#34;, nullable = false )及其父级 如上所示,引用将设置为null?我的猜测: orphanRemoval将在稍后进行,并基于其中的值 数据库,直到Child实体更新为止。但那 更新不会发生,因为nullable = false,对吧?