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

Mon*_*bal 18 java orm hibernate cascade

我有两个类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>
Run Code Online (Sandbox Code Playgroud)

A没有任何映射到B.记住这一点,我们打算在删除关联A时删除B. 如果我可以在B中的多对一关联上定义inverse ="true",那么这可能是可能的,但是hibernate不允许这样做.

有人能帮忙吗?我们不想为此写任何东西.

Chs*_*y76 24

Hibernate只沿着定义的关联级联.如果A对Bs一无所知,那么你对A做的任何事情都不会影响Bs.

因此,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>
Run Code Online (Sandbox Code Playgroud)

请注意,设置cascade="delete"B,你必须在你原来的代码不会做你想要的东西-它告诉Hibernate"删除,如果B被删除,"这很可能导致违反约束(如果有任何其他的烧烤链接到一个).

如果你绝对不能将A的集合添加到A(虽然我真的不能想到情况就是这样),你唯一的另一种选择是在外键级别定义从A到B的级联删除; 删除A后,您的B将被删除.

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

  1. 在删除A之前必须刷新会话(对B进行挂起更新可能会导致错误或A和某些B在后台重新插入)
  2. 必须从所有活动会话和二级缓存中逐出所有与您的A相关联的B(并且因为您没有维护A侧的关系,这意味着所有 B).

  • 那么,这个完整而明确的答案也是+1.我真的需要改进我用英语解释Hibernate的方式:) (2认同)

Pas*_*ent 7

我认为你需要cascade="all,delete-orphan"从A到B的one-to-many关联.