Affects Version/s: 3.3.1, 3.6.0, 4.3.11, 5.0.2
Fix Version/s: 5.0.8
Environment:Hibernate-Core 3.6.0, Hibernate EntityManager 3.6.0, Derby, Spring 3.0.5 (Configuration), JUnit 4.5
Bug Testcase Reminder (view):
Last commented by a user?:true
The method "merge" from the EntityManager causes a duplicated "insert" of a child entity.
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()))