gpt4 book ai didi

java - 如何在 hibernate 中的多对一映射上定义反向级联删除

转载 作者:太空狗 更新时间:2023-10-29 22:33:03 25 4
gpt4 key购买 nike

我有两个类 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>

请注意,在 B 上设置 cascade="delete" 就像您在原始代码中所做的那样不会执行您想要的操作 - 它告诉 Hibernate “删除 A 如果B 被删除”,这可能会导致违反约束(如果有任何其他 B 链接到该 A)。

如果您绝对不能将 B 的集合添加到 A(尽管我真的想不出会出现这种情况的情况),您唯一的另一种选择是在外部定义从 A 到 B 的级联删除关键水平;当您的 A 被删除时,您的 B 将被删除。

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

  1. 在删除 A 之前必须刷新 session (对 B 进行挂起更新可能会导致错误或 A 和一些 B 在幕后重新插入)
  2. 所有链接到您的 A 的 B(并且由于您没有维护 A 方的关系,这意味着所有 B)必须从所有 Activity session 和二级缓存中逐出。

关于java - 如何在 hibernate 中的多对一映射上定义反向级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1715146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com