繁体   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