3

假设我有两个实体,并且它们之间的双向多对多关系映射到 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对象将被删除,但我只想清除连接表中的记录。

4

3 回答 3

0

在这种情况下,正确的设置是cascade="none"

关系中的休眠many-to-many必须使用 3 个表。MyEntityOtherEntity配对表MyEntity-OtherEntity

对表

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

这是通过设置完成的cascade="none"。因为这是处理它的唯一方法。从配对表的角度来看没有级联

级联

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

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

在这种情况下使用此设置

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

更多信息见8.3.4。多对多

于 2013-09-30T17:00:30.567 回答
0

我认为这是触发删除的删除孤儿属性MyOtherEntity

应该替换为cascade="all"

问候。

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

于 2013-09-30T13:22:41.237 回答
0

您可以使用 2 种方法来执行此操作。

1) 使用 Hibernate 原生查询 2) 使用 HibernatecreateSQLQuery()

于 2013-09-30T14:24:35.680 回答