这个问题似乎没有官方答案。至少我找不到。
情况:如果我有一个双向的一对多关联,并且我希望 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) {
[...]
}
}
我在我的书“Pro JPA 2 by Mike Keith”(第二版,第 287 页)中看到了这个解释:
还有一些帖子可以同时完成这两件事:指定后,orphanRemoval 元素会在父级和子级之间的关系中断时导致子实体被删除。 这可以通过将保存的属性设置为 null 来完成 相关实体,或另外在一对多情况下通过从集合中删除子实体。然后,提供者负责在刷新或提交时(以先到者为准)删除孤立的子实体。 在亲子关系中,孩子依赖于父母的存在。如果父母被移除, 那么根据定义,孩子就成为孤儿,也必须被带走。
我的问题:
1) 什么是正确的/现在两者中哪一个是必要的?2) 如果 Child 类有一个会发生什么 @JoinColumn(name="parentID",
nullable=false) 及其父级 如上所示,引用将设置为 null?我的猜测: orphanRemoval 将在稍后进行,并且基于中的值 数据库,因此直到子实体更新为止。但那个 更新不会发生,因为 nullable=false,对吗?
mappedBy
),而
orphanRemoval
必须添加到非-拥有一侧。我怀疑
orphanRemoval
会被忽略,但经过一些测试后发现它确实有效。因此,即使您的一对多是双向的,您也可以使用
orphanRemoval=true
和
children.remove(child)
,结果
child
会从数据库中完全删除。