簡體   English   中英

如何在hibernate中的多對一映射上定義反級聯刪除

[英]how to define an inverse cascade delete on a many-to-one mapping in hibernate

我有兩個類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不允許這樣做。

有人能幫忙嗎? 我們不想為此寫任何東西。

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>

請注意,設置cascade="delete"B ,你必須在你原來的代碼不會做你想要的東西-它告訴Hibernate這很可能導致約束違反“如果B被刪除,刪除A”(如果有任何與A)相關的其他Bs。

如果你絕對不能將A的集合添加到A(雖然我不能真正想到那種情況),你唯一的另一種選擇是在外鍵級別定義從A到B的級聯刪除; 刪除A后,您的B將被刪除。

但是,這是一個相當丑陋的解決方案,因為您必須非常小心如何在Hibernate中刪除A:

  1. 在刪除A之前必須刷新會話(對B進行掛起更新可能會導致錯誤或A和某些B在后台重新插入)
  2. 必須從所有活動會話和二級緩存中逐出所有與您的A相關聯的B(並且因為您沒有維護A側的關系,這意味着所有 B)。

我認為你需要從A到B的cascade="all,delete-orphan"one-to-many關聯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM