我收到了一个错误:
不要用cascade=“所有删除-孤儿”更改对集合的引用。
在尝试以下操作时:
beginTx();
Parent parent = new Parent();
Child child = new Child();
parent.addChild(child);
getSession().save(parent);
commitTx();
closeSession();
beginTx();
//id is the primary key
child.setID(null);
getSession().update(child);
commitTx();
closeSession();父级和子级由one-to-many与梯级= 'all-delete-orphan‘关联。
class Parent {
Set child;
}
<set name="child" table="Child" cascade="all-delete-orphan" inverse="true">
<key column="FK"></key>
<one-to-many class="Child"/>
</set>知道为什么会抛出这个异常吗?为什么在主键上设置null会导致此异常,即使实体处于分离状态?
发布于 2013-09-20 08:22:39
如果加载具有cascade=all-delete-orphan集合的实体,然后删除对集合的引用,则通常会发生此异常。
不要替换这个收藏品。始终使用collection.clear()删除所有相关的子条目,以便孤儿删除算法能够检测到更改。如果您想要删除任何特定的子级,只需将其从集合中删除即可。一旦它从集合中删除,它将被视为孤儿,并将被删除。
发布于 2016-07-11 06:17:24
对于异常,不要用cascade=更改对集合的引用“所有删除-孤儿”.you使用child.setID(null);更改ID导致异常。
hibernate使用PersistentSet执行异常检查,因此您可以这样做:
child.setID(null);
parent.child=new HashSet(parent.child)使用HashSet替换PersistentSet
发布于 2015-11-11 13:44:10
这是因为关闭事务不会关闭当前会话。这意味着child仍然是当前会话的一部分,Hibernate仍然会认为它是同一个子会话,并且将尝试在DB上删除它的id。
如果要使child对象处于瞬态状态,则应在其上使用evict()。
https://stackoverflow.com/questions/18910641
复制相似问题