假设我有两个实体,并且在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
对象会被删除,但我只想清除连接表中的记录。
答案 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个表一起使用。 MyEntity
,OtherEntity
和配对表MyEntity-OtherEntity
。
一旦我们通过将MyEntity
实例添加到OtherEntity
集合中来创建关系,反之亦然,Hibernate将隐藏将记录插入到配对表中。
一旦我们从集合中删除了一些实例,Hibernate将从配对表中删除记录。
使用设置cascade="none"
完成此操作。因为它是如何处理它的唯一方法。从配对表的角度来看,没有级联
在many-to-many
关系上应用的任何级联都不适用于配对表,而是适用于第二端。在大多数情况下,这是我们不想要的。我们应该为MyEntity
管理和OtherEntity
管理分离DAO。
在极少数情况下,在更新一端时,我们要插入,更新甚至删除其他...我们可以使用级联。但这不是我们的情况。
在此方案中使用此设置
<set name="myOtherEntities" cascade="none">