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

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

马煌
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”,但休眠状态不允许这样做,则这是可能的。

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


问题答案:

休眠仅沿着定义的关联进行级联。如果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原样打开将不会执行您想要的操作-
它告诉Hibernate“如果删除了B则删除A”,这很可能会导致约束冲突(如果还有其他B链接到该A )。

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

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

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


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

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

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

  • 问题内容: 我有一个颜色枚举 我有包含它的MyEntity。 我已经有一个UserType来映射我的枚举。 您知道如何在Hibernate hbm.xml中映射枚举集吗? 我需要一个UserType还是最简单的方法? 谢谢 编辑: 只是为了说明一下,我正在寻找 hbm.xml 配置而不是@CollectionOfElements注释 问题答案: 我使用EnumSet映射线程中的解决方案,该解决方案

  • 问题内容: 我希望UserAcounts可以有许多UserGroups,而所有Groups可以有许多Users。还有一个联接表。我希望在删除useraccount时删除联接表中useraccount和usergroup之间的关系。 实际上,我想使用“在删除级联上”。在ManyToMany关系中,我不会不幸地运行它。我已经尝试了很多事情,但没有找到解决方案。 注意:我只想在删除级联上删除关系 是否有

  • 问题内容: 我有一个用户表和一个具有一对一映射表的表,其中一个字段用于此关系,该字段存储相应用户的ID字段值。 如何为此关系编写hibernate文件? 更新 我的问题是用户的主键是,user_detail的外键是 我在Internet用户user_id中获得的所有示例均作为用户主键,与其他表中的外键相同 问题答案: 对于用户映射…。 用于UserDetail映射。