簡體   English   中英

如何刪除兩個實體之間的多對多關聯?

[英]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個表一起使用。 MyEntityOtherEntity和配對表MyEntity-OtherEntity

配對表

一旦我們通過將MyEntity實例添加到OtherEntity集合中來創建關系,反之亦然,Hibernate將隱藏地將記錄插入到配對表中。 一旦我們從集合中刪除了一些實例,Hibernate將從配對表中刪除記錄。

這樣做,設置cascade="none" 因為它是如何處理它的唯一方法。 從配對表的角度來看,沒有級聯

級聯

任何應用於many-to-many關系的級聯都不適用於配對表,而是適用於第二端。 在大多數情況下,這是我們不想要的。 我們應該將DAO分離為MyEntity管理和OtherEntity管理。

在極少數情況下,在更新一端時,我們要插入,更新甚至刪除其他...我們可以使用級聯。 但這不是我們的情況。

在此方案中使用此設置

<set name="myOtherEntities" cascade="none">

查看更多8.3.4。 許多一對多

暫無
暫無

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

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