The method "merge" from the EntityManager causes a duplicated "insert" of a child entity.

Description

The method "merge" from the EntityManager causes a duplicated "insert" of a child entity.
Related to HHH-3332

Observed Behavior:

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:

  1. retrieve an instance of A from persistence (A a = em.find(A.class, id))

  2. add a new B to A (a.getBs.add(new B()))

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

Expected behavior:

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.

Notes (Discoveries):

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

Environment

Hibernate-Core 3.6.0, Hibernate EntityManager 3.6.0, Derby, Spring 3.0.5 (Configuration), JUnit 4.5

Status

Assignee

Gail Badner

Reporter

Seth Martin

Fix versions

Labels

backPortable

None

Suitable for new contributors

None

Requires Release Note

None

Pull Request

None

backportDecision

None

Affects versions

Priority

Critical
Configure