如何删除两个实体之间的多对多关联?

时间:2013-09-30 12:49:15

标签: java hibernate hibernate-mapping

假设我有两个实体,并且在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对象会被删除,但我只想清除连接表中的记录。

3 个答案:

答案 0 :(得分:0)

我认为删除orphan属性会触发MyOtherEntity的删除。

应替换为cascade="all"

问候。

附录:Hibernate doc在第11章中指出级联all-delete-orphan不应与ManytoMany关系一起使用。

答案 1 :(得分:0)

有两种方法可以用来做到这一点。

1)使用Hibernate Native Query 2)使用Hibernate createSQLQuery()

答案 2 :(得分:0)

此方案中的正确设置为cascade="none"

many-to-many关系中的Hibernate必须与3个表一起使用。 MyEntityOtherEntity和配对表MyEntity-OtherEntity

配对表

一旦我们通过将MyEntity实例添加到OtherEntity集合中来创建关系,反之亦然,Hibernate将隐藏将记录插入到配对表中。 一旦我们从集合中删除了一些实例,Hibernate将从配对表中删除记录。

使用设置cascade="none"完成此操作。因为它是如何处理它的唯一方法。从配对表的角度来看,没有级联

级联

many-to-many关系上应用的任何级联都不适用于配对表,而是适用于第二端。在大多数情况下,这是我们不想要的。我们应该为MyEntity管理和OtherEntity管理分离DAO。

在极少数情况下,在更新一端时,我们要插入,更新甚至删除其他...我们可以使用级联。但这不是我们的情况。

在此方案中使用此设置

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

查看更多8.3.4. Many-to-many