Hibernate inserta duplicados en una colección @OneToMany
Tengo una pregunta sobre Hibernate 3.6.7 y JPA 2.0.
Considere las siguientes entidades (se omiten algunos captadores y establecedores por brevedad):
@Entity
public class Parent {
@Id
@GeneratedValue
private int id;
@OneToMany(mappedBy="parent")
private List<Child> children = new LinkedList<Child>();
@Override
public boolean equals(Object obj) {
return id == ((Parent)obj).id;
}
@Override
public int hashCode() {
return id;
}
}
@Entity
public class Child {
@Id
@GeneratedValue
private int id;
@ManyToOne
private Parent parent;
public void setParent(Parent parent) {
this.parent = parent;
}
@Override
public boolean equals(Object obj) {
return id == ((Child)obj).id;
}
@Override
public int hashCode() {
return id;
}
}
Ahora considere esta pieza de código:
// persist parent entity in a transaction
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Parent parent = new Parent();
em.persist(parent);
int id = parent.getId();
em.getTransaction().commit();
em.close();
// relate and persist child entity in a new transaction
em = emf.createEntityManager();
em.getTransaction().begin();
parent = em.find(Parent.class, id);
// *: parent.getChildren().size();
Child child = new Child();
child.setParent(parent);
parent.getChildren().add(child);
em.persist(child);
System.out.println(parent.getChildren()); // -> [Child@1, Child@1]
em.getTransaction().commit();
em.close();
a entidad secundaria se está insertando incorrectamente dos veces en la lista de elementos secundarios de la entidad principal.
Al realizar una de las siguientes acciones, el código funciona bien (no hay entradas duplicadas en la lista):
quitar elmappedBy
atributo en la entidad principal realizar alguna operación de lectura en la lista de elementos secundarios (por ejemplo, línea de comentario desmarcada por*
)Esto obviamente es un comportamiento muy extraño. Además, cuando se utiliza EclipseLink como proveedor de persistencia, el código funciona exactamente como se esperaba (sin duplicados).
Es esto un error de Hibernate o me falta algo?
Gracia