The orphanRemoval
property allows you to easily manage OneToMany
and
OneToOne
relationships. If a relationship has orphanRemoval
set to true,
then whenever a child is removed from the parent entity it will also be deleted
from the database.
But when used in combination with Play’s POJO binding, it can cause some unexpected errors. Consider the following example:
1 2 3 4 5 |
|
And our Controller:
1 2 3 4 5 6 7 |
|
This will throw the following exception:
PersistenceException occured : org.hibernate.HibernateException: A collection
with cascade="all-delete-orphan" was no longer referenced by the owning entity
instance: models.Parent.childs
The problem
To make the orphanRemoval
work Hibernate has to keep track of the Collection
that is referencing the childs. When update()
is called, the childs List is
assigned a new instance, this is what causes the PersistenceException
.
The solution
We can easily solve this by providing a setter for childs
which will prevent
it from being assigned a new instance. Here is the fixed Parent
model:
1 2 3 4 5 6 7 8 9 10 11 12 |
|