The method "merge" from the EntityManager causes a duplicated "insert" of a child entity.
Related to HHH-3332
When you have an Entity A with a OneToMany(fetch=LAZY, cascade=ALL or (MERGE and PERSIST)) relationship to another Entity B and attempt to add an new B instance to A hibernate will generate a duplicate insert command upon commit.
I have witnessed this problem occurring when this procedure is followed:
retrieve an instance of A from persistence (A a = em.find(A.class, id))
add a new B to A (a.getBs.add(new B()))
merge instance 'a' back into persistence (em.merge(a))
Upon transaction commit hibernate will generate an additional "insert" statement and insert the new instance of b into the data source twice.
I would expect hibernate to only perform a single insertion when 'a' is merged back to persistence and the B's are created through the cascade.
This problem can be worked around by:
Changing the OneToMany relationship from a List to a Set
Only using either Cascade MERGE or PERSIST not both of ALL
Add a new B to A.getBs by adding to the '0' index (a.getBs.add(0,new B()))
Hibernate-Core 3.6.0, Hibernate EntityManager 3.6.0, Derby, Spring 3.0.5 (Configuration), JUnit 4.5
Gail asked that we hold off applying this for 5.0.7 as we need to discuss. She is on holidays, so we will discuss when she gets back.
This PR fixes the issue. I'm looking forward to integrating this if Gail thinks there's nothing to be added to this commit.
Fixed in master and 5.0 branches.
Thanks Gail for taking care of this issue.
Great news !
Thanks a lot for addressing this !