Don't change the reference to a collection with cascade=“all-delete-orphan”

南笙酒味 提交于 2019-12-05 22:00:50

问题


I am getting an error:

Don't change the reference to a collection with cascade="all-delete-orphan"

while trying the following operation:

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();

Parent and child are related by one-to-many with cascade = '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>

Any idea why this exception is being thrown? Why is setting null on the primary key causing this exception even though the entity is in detached state ?


回答1:


This exception normally happens if you load an entity having a collection with cascade=all-delete-orphan, and then you remove the reference to the collection.

Don't replace this collection. Always use collection.clear() to remove all the associated child entries so that the orphan-deletion algorithm can detect the changes. And if you want to remove any particular child, you just need to remove it from the collection. Once it is removed from the collection, it will be considered as an orphan and will be deleted.




回答2:


for the exception Don't change the reference to a collection with cascade="all-delete-orphan".you use child.setID(null); change the ID cause the exception.

hibernate use PersistentSet to execute the exception check,so you can do this:

child.setID(null);
parent.child=new HashSet(parent.child)

use HashSet to replace PersistentSet




回答3:


That's because closing the transaction doesn't close the current session. That means that child is still part of the current session, and Hibernate will still consider it to be the same child, and will try to null out its id on the DB.

If you want to make the child object transient, you should use evict() on it.



来源:https://stackoverflow.com/questions/18910641/dont-change-the-reference-to-a-collection-with-cascade-all-delete-orphan

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!