【问题标题】:JPA Cascade remove orphansJPA 级联删除孤儿
【发布时间】:2013-06-05 18:42:28
【问题描述】:

我有一个问题。我将 JPA 与 eclipselink 一起使用,并且我有关系:

Table A ---< Table AB >---- Table B

class A {    
@OneToMany(mappedBy = "a")
private List<AB> abList    
}

class AB {    
@ManyToOne(fetch = FetchType.LAZY)
private A a;    
@ManyToOne(fetch = FetchType.LAZY)
private B b;    
}

class B {    
@OneToMany(mappedBy = "b")
private List<AB> abList;
}

A 和 B 之间的连接表 AB 是多对多关系。 现在我想从表 A 中删除一条记录,并从表 AB(连接表)和 B 表中级联删除记录。

但来自 B 的只有那些未连接到表 A 中任何其他记录的记录(many-to-many A 和 B 之间的关系)。

我应该如何设置 CascadeType 或 orphanremoval 才能正确执行?

【问题讨论】:

    标签: jpa many-to-many


    【解决方案1】:

    如果您想在删除 A 时删除 AB 和 B,则只需设置级联删除(如果您想删除已删除的实例,则设置 orphanRemoval=true)。

    如果从 A 到 B 的关系是真正的 ManyToMany,即 B 可以有多个引用,那么您不能将删除级联到 B,(但仍然可以级联到 AB,确保您在模型中保持双向关系)。

    如果从任何地方碰巧与 B 没有关系,则无法删除 B。这类似于垃圾收集,在关系数据库中不存在。您需要从您的应用程序中处理此问题。如果 B 是您想与 A 一起删除的东西,则考虑不共享它,而是让每个 A 都有自己的私有 B 实例。

    【讨论】:

      【解决方案2】:

      我想你正在使用 Hibernate 你应该做一个 orphanRoval=true,

      之后试试这个: 假设我们需要删除一个(哪个类是A), 我们制作:

       for (AB ab : a.getAbList()) {
          B b = ab.get();
          if (b.getAbList().size()==1) {
              em.remove(b);
         }
         em.remove(ab);
       }
       em.remove(a);
      

      希望有帮助

      【讨论】:

      • 感谢您的回答。实际上我不是在使用hibernate,而是使用eclipseLink。如果你做了三个 em.remove 你就不需要 orphanRemoval...
      猜你喜欢
      • 2012-08-16
      • 2010-09-23
      • 2011-02-09
      • 2018-03-31
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      相关资源
      最近更新 更多