首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不要用cascade=“所有删除-孤儿”更改对集合的引用。

不要用cascade=“所有删除-孤儿”更改对集合的引用。
EN

Stack Overflow用户
提问于 2013-09-20 06:56:03
回答 4查看 28.6K关注 0票数 10

我收到了一个错误:

不要用cascade=“所有删除-孤儿”更改对集合的引用。

在尝试以下操作时:

代码语言:javascript
复制
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‘关联。

代码语言:javascript
复制
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会导致此异常,即使实体处于分离状态?

EN

回答 4

Stack Overflow用户

发布于 2013-09-20 08:22:39

如果加载具有cascade=all-delete-orphan集合的实体,然后删除对集合的引用,则通常会发生此异常。

不要替换这个收藏品。始终使用collection.clear()删除所有相关的子条目,以便孤儿删除算法能够检测到更改。如果您想要删除任何特定的子级,只需将其从集合中删除即可。一旦它从集合中删除,它将被视为孤儿,并将被删除。

票数 10
EN

Stack Overflow用户

发布于 2016-07-11 06:17:24

对于异常,不要用cascade=更改对集合的引用“所有删除-孤儿”.you使用child.setID(null);更改ID导致异常。

hibernate使用PersistentSet执行异常检查,因此您可以这样做:

代码语言:javascript
复制
child.setID(null);
parent.child=new HashSet(parent.child)

使用HashSet替换PersistentSet

票数 3
EN

Stack Overflow用户

发布于 2015-11-11 13:44:10

这是因为关闭事务不会关闭当前会话。这意味着child仍然是当前会话的一部分,Hibernate仍然会认为它是同一个子会话,并且将尝试在DB上删除它的id

如果要使child对象处于瞬态状态,则应在其上使用evict()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18910641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档