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 ?
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.