0

我有个问题。我将 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;
}

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

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

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

4

2 回答 2

2

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

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

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

于 2013-06-10T13:44:06.107 回答
0

I suppose you are working with Hibernate you should make an orphanRoval=true,

after that try this: supposing we needto remove a (which class is A), we make :

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

Hope this help

于 2013-06-10T08:37:27.287 回答