1

所以这是一个似乎没有官方答案的问题。至少我一个也找不到。

情况:如果我有一个双向的一对多关联并且我希望 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 来完成,或者在一对多的情况下通过从集合中删除子实体来完成。然后,提供者负责在刷新或提交时间(以先到者为准)删除孤立的子实体。在父子关系中,孩子依赖于父母的存在。如果父母被移除,那么根据定义,孩子成为孤儿,也必须被移除。

然后是那些同时做这两个的帖子:

我的问题:

1)什么是正确的/现在需要两者中的哪一个?

2) 如果 Child 类有一个 @JoinColumn(name="parentID", nullable=false ) 并且它的父引用将设置为 null 会发生什么,如上所示?我的猜测:orphanRemoval 将在稍后发生,并且基于数据库中的值,所以直到 Child 实体被更新。但是由于 nullable=false,该更新不会发生,对吧?

4

0 回答 0