Tengo una pregunta sobre Hibernate 3.6.7 y JPA 2.0.Hibernate inserta duplicados en una colección @OneToMany
Considere siguientes entidades (unos captadores y definidores se omiten por razones de 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 esto trozo 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()); // -> [[email protected], [email protected]]
em.getTransaction().commit();
em.close();
está siendo insertado erróneamente La entidad secundaria dos veces en la lista de hijos de la entidad matriz.
Al hacer uno de los siguientes, el código funciona (no hay entradas duplicadas en la lista) finas:
- quitar el atributo
mappedBy
en la entidad matriz - realizar alguna operación de lectura en la lista de los niños (por ejemplo, línea de comentario marcada con
*
)
Esto es obviamente un comportamiento muy extraño. Además, cuando se utiliza EclipseLink como proveedor de persistencia, el código funciona tal como se esperaba (sin duplicados).
¿Es esto un error de Hibernate o me falta algo?
Gracias
¿Es posible añadir el código del método setParent y de los Iguales/métodos hashCode? –
Acabo de agregar los métodos que solicitó. Sin embargo, no creo que este problema esté relacionado con equals/hashCode. – user1014562
Sus métodos iguales no respetan el contrato de Object.equals. Además, el hashCode cambia cuando el ID se genera y se asigna a la entidad. No me sorprendería si el error desapareciera una vez que eliminas hashCode y es igual. Por cierto. Hibernate recomienda no usar ID para implementar equals y hashCode. –