JPA:双向关联和孤儿移除 - 需要从双方(父级和子级)移除关联?

问题描述 投票:0回答: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) {
  [...]
 }

}

我在我的书“Pro JPA 2 by Mike Keith”(第二版,第 287 页)中看到了这个解释:

指定后,orphanRemoval 元素会在父级和子级之间的关系中断时导致子实体被删除。 这可以通过将保存的属性设置为 null 来完成 相关实体,另外在一对多情况下通过从集合中删除子实体。然后,提供者负责在刷新或提交时(以先到者为准)删除孤立的子实体。 在亲子关系中,孩子依赖于父母的存在。如果父母被移除, 那么根据定义,孩子就成为孤儿,也必须被带走。

还有一些帖子可以同时完成这两件事:

  • https://stackoverflow.com/a/23926548
  • https://stackoverflow.com/a/3071125
  • https://coderanch.com/t/652044/databases/Delete-Bi Direction-Entities#3012875

我的问题:

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

2) 如果 Child 类有一个会发生什么 @JoinColumn(name="parentID",

nullable=false) 及其父级 如上所示,引用将设置为 null?我的猜测: orphanRemoval 将在稍后进行,并且基于中的值 数据库,因此直到子实体更新为止。但那个 更新不会发生,因为 nullable=false,对吗?

jpa parent-child bidirectional orphan
1个回答
0
投票
有类似的问题,并且无法真正理解这是如何发生的,因为该关系由多方拥有(由于

mappedBy

),而
orphanRemoval
必须添加到非-拥有一侧。我怀疑 
orphanRemoval
 会被忽略,但经过一些测试后发现它确实有效。

因此,即使您的一对多是双向的,您也可以使用

orphanRemoval=true

children.remove(child)
,结果 
child
 会从数据库中完全删除。

© www.soinside.com 2019 - 2024. All rights reserved.