У меня есть вопрос относительно Hibernate 3.6.7 и JPA 2.0.
Рассмотрим следующие сущности (некоторые геттеры и сеттеры опущены для краткости):
@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;
}
}
Теперь рассмотрим этот фрагмент кода:
// 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();
Детский объект неправильно вводится дважды в список дочерних элементов родительского объекта.
При выполнении одного из следующих действий код работает нормально (нет дубликатов записей в списке):
- удалить атрибут
mappedBy
в родительском объекте - выполнить некоторую операцию чтения в списке дочерних элементов (например, строка uncomment, помеченная
*
)
Это, очевидно, очень странное поведение. Кроме того, при использовании EclipseLink в качестве поставщика непрерывности код работает так, как ожидалось (без дубликатов).
Является ли это ошибкой Hibernate или я что-то упускаю?
Спасибо