如何删除双向多对多关联

slo*_*mir 12 many-to-many hibernate

问题:

两个实体A和B 之间多对多的关联.我将一个实体设置他们关系所有者(inverse = true在b.hbm.xml中的A集合中).

当我删除A实体时,删除连接表中的相应记录.
当我删除B实体时,不删除连接表中的相应记录(完整性违规例外).

-

让我们考虑一些非常简单的例子:

class A{  
    Set<B> bset=new HashSet<B>();
    //...
}  

class B{  
    Set<A> aset=new HashSet<A>();  
    //...
}
Run Code Online (Sandbox Code Playgroud)

文件a.hbm.xml [m-to-m mappings only]:

<set name="bset" table="AB">  
    <key name="a_id"/>  
    <many-to-many column="b_id" class="B"/>  
</set>
Run Code Online (Sandbox Code Playgroud)

文件b.hbm.xml [m-to-m mappings only]:

<set name="aset" table="AB" inverse="true">  
    <key name="b_id"/>  
    <many-to-many column="a_id" class="A"/>  
</set>
Run Code Online (Sandbox Code Playgroud)

数据库关系:

A(id,...)  
B(id,...)  
AB(a_id,b_id)
Run Code Online (Sandbox Code Playgroud)

假设我们在AB联合表中一些记录.例如:

AB = {(1,1),(1,2)}

其中AB = {(a_id,b_id)| ......}

-

情况1 - 可能因为A是AB关系的所有者而起作用:

A a=aDao.read(1);  //read A entity with id=1  
aDao.delete(a);    //delete 'a' entity and both relations with B-entities
Run Code Online (Sandbox Code Playgroud)

情况2 - 不起作用:

B b=bDao.read(1);   //read B entity with id=1  
bDao.delete(b);     //foreign key integrity violation
Run Code Online (Sandbox Code Playgroud)

一方面,这对我来说是合乎逻辑的,因为A实体负责他与B的关系.但是,另一方面,它不符合逻辑,或者至少它不是类似于orm的解决方案,我必须明确删除连接表中出现具体B实体的所有记录,然后删除B实体,如我在情境3中所示:

情况3 - 工作,但不是'优雅':

B b=bDao.read(1);  
Set<A> aset=b.getA();     //get set with A entities
Iterator i=aset.iterator();  

//while removes 'b' from all related A entities  
//while breaks relationships on A-side of relation (A is owner)
while(i.hasNext()){  
    A a=i.next();  
    a.bset.remove(b);   //remove entity 'b' from  related 'a' entity 
    aDao.update(a);       //key point!!! this line breaks relation in database
}  
bDao.delete(b);           //'b' is deleted because there is no related A-entities
Run Code Online (Sandbox Code Playgroud)

-

所以,我的问题是:有没有更方便的方法来删除双向多对多关联中的无所有者实体(在我的例子中为B)以及来自联合表的所有多对多关系?

Sat*_*was 8

我没有看到代码有什么不优雅.它在所有情况下都能正常工作,并且不会做任何不应该做的额外的事情.当我说A拥有的一方是AB的关系时,这意味着创建或删除关系掌握在A.的手中.B在关系中没有发言权.因此,如果我想将B移动到其他地方,A必须放弃B才能将B移开.因此,在选择拥有方时,您应该考虑对象的用途.