[英]How to delete a many-to-many association between two entities?
假設我有兩個實體,並且在Hibernate中映射它們之間的雙向多對多關系。
兩個類中的xml配置如下所示:
<hibernate-mapping>
<class name="com.example.MyEntity">
<set name="myOtherEntities" cascade="all-delete-orphan">
<key column="entity_id"/>
<many-to-many column="my_other_entity_id" class="com.example.OtherEntity" />
</set>
</class>
</hibernate-mapping>
如何在不刪除任何實體的情況下僅終止它們之間的關聯?
如果我clear()
MyEntity
的集合並調用Session.flush()
那么MyOtherEntity
對象將被刪除,但我只想清除連接表中的記錄。
我認為刪除orphan屬性會觸發MyOtherEntity
的刪除。
應該用cascade="all"
代替
問候。
附錄:Hibernate doc在第11章中指出,cascade all-delete-orphan
不應該與ManytoMany
關系一起使用。
有兩種方法可以用來做到這一點。
1)使用Hibernate Native Query 2)使用Hibernate createSQLQuery()
此方案中的正確設置是cascade="none"
。
many-to-many
關系中的Hibernate必須與3個表一起使用。 MyEntity
, OtherEntity
和配對表MyEntity-OtherEntity
。
一旦我們通過將MyEntity
實例添加到OtherEntity
集合中來創建關系,反之亦然,Hibernate將隱藏地將記錄插入到配對表中。 一旦我們從集合中刪除了一些實例,Hibernate將從配對表中刪除記錄。
這樣做,設置cascade="none"
。 因為它是如何處理它的唯一方法。 從配對表的角度來看,沒有級聯
任何應用於many-to-many
關系的級聯都不適用於配對表,而是適用於第二端。 在大多數情況下,這是我們不想要的。 我們應該將DAO分離為MyEntity
管理和OtherEntity
管理。
在極少數情況下,在更新一端時,我們要插入,更新甚至刪除其他...我們可以使用級聯。 但這不是我們的情況。
在此方案中使用此設置
<set name="myOtherEntities" cascade="none">
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.