当前位置: 首页 > 面试题库 >

如何删除双向多对多关联

陈文景
2023-03-14
问题内容

问题:

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

当我 删除一个A实体时联接表中的 相应 记录也会被删除
当我 删除一个B实体时联接表中的 相应 记录不会被删除 (完整性违反异常)。

-

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

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

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

文件 a.hbm.xml [仅适用于m-to-m映射]:

<set name="bset" table="AB">  
    <key name="a_id"/>  
    <many-to-many column="b_id" class="B"/>  
</set>

文件 b.hbm.html" target="_blank">xml [仅m-to-m映射]:

<set name="aset" table="AB" inverse="true">  
    <key name="b_id"/>  
    <many-to-many column="a_id" class="A"/>  
</set>

数据库 关系

A(id,...)  
B(id,...)  
AB(a_id,b_id)

假设我们 在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

情况2- 不起作用:

B b=bDao.read(1);   //read B entity with id=1  
bDao.delete(b);     //foreign key integrity violation

一方面,这对我来说是合乎逻辑的,因为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

-

因此,我的问题 是:是否有更方便的方法从联合表中删除双向多对多关联及其所有多对多关系中的无主实体(在我的示例中为B)?


问题答案:

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



 类似资料:
  • 1. 前言 通过本节课程的学习,你将发现关联对象之间的微妙关系。相信这种关系对你更深入地认识 HIbernate 有很大的帮助。 通过本节课程,你将了解到: 多对多双向关联映射中哪一方是关系维系者; 级联操作与关系维系者。 2. 关系维系者 新学期开始了,同学们选择了各自喜欢的课程,现在为学生添加选修课程的任务就要落在 Hibernate 的身上。一起来看看 Hibernate 是如何完成这个任务

  • 问题内容: 我有两个与多对多关联的表。 —数据库片段: 加载 ID 名称 会话 ID 日期 sessionsloads LoadId 的SessionID —hibernate映射片段: 为了从关联表 sessionloads中 删除一个条目,我执行以下代码: 但是,启动后,此代码将保持不变。 删除关联的正确方法是什么? 问题答案: 您需要更新和之间的链接的两端: 实际上,许多开发人员使用防御性方

  • 1. 前言 本节课程和大家一起聊聊一对多关联映射。通过本节课程,你将了解到: 如何实现一对多关联映射; 如何实现双向一对多关联映射; 关联映射中的级联操作。 2. 一对多关联映射 关系型数据库中表与表中的数据存在一对多(或多对一)关系。 如学生表、班级表。一个班级有多个学生,多个学生可以在同一个班级。 一对多或多对一本质上是一样的,如同一块硬币的正面和反面,只是看待事物的角度不同而已。 数据库中有

  • 问题内容: 我要删除具有多对多关系的一个站点上的表中的一行。我还想删除该关系另一侧的所有相关行。 例如,假设我有以下表格,并且想从中删除一行。我也想从中删除所有相关的行,当然,也删除其中不再需要的任何行。 我知道如何在查询中连接以上表格。但是我看不到如何删除整个关系中的数据。 注意:关系的两端都实现级联删除。因此,例如,从中删除行将删除中的任何相关行。但是显然,这不会传播到表中。 问题答案: 我认

  • 我在和之间具有双向多对多关系。在的帮助下创建两个实体,甚至创建它们的子实体都是简单明了的。 和都可以在的帮助下轻松地自动持久化,如下所示: 然而...更新会导致异常: 我尝试修改的以包括、和/或,但未成功。我们怎么绕过这件事?

  • 我目前正在开发一个网络票证系统,并有课程来存储我的票证数据。每个票据都可以有多个相关标签,为了管理这些标签,我创建了一个标签编辑器。这很好,只缺少一个删除选项。到目前为止,大多数删除都失败了,原因是该标签仍然被另一个票证引用,这需要先删除它。在寻找解决方案的过程中,我遇到了CascadeType。删除,这似乎正是我想要的。 但是,由于ticket对象包含一组标签,而不是相反,因此每次我删除一张ti