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

如何在hibernate中的多对一映射上定义逆级联删除

党源
2023-03-14
问题内容

我有两个类A和B。许多B可以与一个A关联,因此从B到A是多对一的关系。我已经将这种关系映射为:

<class name="A" table="tbl_A">
  <property name="propA" column="colA"/>
</class>
<class name="B" table="tbl_B">
  <property name="propB" column="colB"/>
  <many-to-one name="a" class="A" column="col1" cascade="delete"/>
</class>

A没有映射到B。记住这一点,我们打算在删除与A关联的B时将其删除。如果我可以在B中的多对一关联中定义inverse =“
true”,但hibernate则不允许这样做,这是可能的。

有人能帮忙吗?我们不想为此在A中写任何东西。


问题答案:

hibernate仅沿着定义的关联进行级联。如果A对B不了解,那么您对A所做的任何事情都不会影响B。

因此,Pascal的建议是您要做的最简单的方法

<class name="A" table="tbl_A">
  ...
  <set name="myBs" inverse="true" cascade="all,delete-orphan">
    <key column="col1"/>
    <one-to-many class="B"/>
  </set>
</class>

<class name="B" table="tbl_B">
  ...
  <many-to-one name="a" class="A" column="col1" not-null="true"/>
</class>

请注意,在原始代码中cascade="delete"B原样设置on 并不会执行您想要的操作-
它告诉Hibernate“如果B被删除,则删除A”,这很可能导致约束冲突(如果还有其他B链接到该A )。

如果您绝对不能向A添加B的集合(尽管我真的不认为会是这种情况),您唯一的另一种选择是在外键级别上定义从A到B的级联删除。然后,当您删除A时,您的B将被删除。

但是,这是一个非常丑陋的解决方案,因为您必须非常小心在Hibernate中删除A的方式:

  1. 必须先刷新会话,然后才能删除A(对B的待定更新可能会导致错误,或者A和某些B在后台重新插入)
  2. 必须从所有活动会话和第二级缓存中逐出与您的A链接的所有B(并且由于您未从A端维护关系,这意味着 所有 B)。


 类似资料:
  • 问题内容: 我有两个类A和B。许多B可以与一个A关联,因此从B到A是多对一的关系。我已经将这种关系映射为: A没有映射到B。记住这一点,我们打算在删除与A关联的B时将其删除。如果我可以在B中的多对一关联中定义inverse =“ true”,但休眠状态不允许这样做,则这是可能的。 有人能帮忙吗?我们不想为此在A中写任何东西。 问题答案: 休眠仅沿着定义的关联进行级联。如果A对B不了解,那么您对A所

  • 问题内容: 我在我的数据库3个表:,和 学生可以有多个课程,课程可以有多个学生。和之间存在多对多关系。 我为我的项目和课程添加了3个案例。 (a)当我添加用户时,它会保存得很好, (b)当我为学生添加课程时,它会在-预期行为中创建新的行。 (三)当我试图删除学生,则在删除适当的记录和,但它也删除其中不需要的记录。即使课程中没有任何用户,我也希望课程在那里。 下面是我的表和注释类的代码。 这是Hib

  • 1. 前言 本节课,咱们一起继续聊聊多对多关联映射。通过本节课程,你将了解到: 多对多关联映射的实现; 双向多对多关联映射的实现。 2. 多对多关联映射 首先了解表中的多对多关系,学生表中的数据和课程表中的数据就存在多对多关系。 一名学生可以选修多门课程,一门课程可以供多名学生选修。 数据库通过主外键的机制描述表中的数据之间的关系。对于存在多对多关系的数据表,借助于中间表,分拆成两个一对多(或者多

  • 下面的映射给出的错误为 从db.karateInvoiceDetail引用db.karateInvoice的外键的列数错误。应为1 想法是有一个表,它的组合键为(id、fiscalyear和companyId),而表的组合键为(seqNo、InvoiceId、InvoiceFiscalYear和InvoiceCompanyId)。

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

  • 1. 前言 本节课程和大家一起聊聊关联映射。通过本节课程的学习,你将了解到: 什么是关联映射; 如何实现一对一关联映射。 2. 关联映射 关系数据库中的数据以表为家,一张表一个家,一个家住一类数据。众多表组成关系型社区,关系型社区群体中的数据关系通过主外键方式描述。 表与表之间的数据根据彼此的关系可分为: 一对一关系: 如老公表和老婆表的关系; 一对多关系: 如用户表和银行账号表关系; 多对一关系