Tôi có một câu hỏi liên quan đến Hibernate 3.6.7 và JPA 2.0.Hibernate chèn các bản sao vào bộ sưu tập @OneToMany
Xem xét đối tượng sau đây (một số getter và setter bị bỏ qua cho ngắn gọn):
@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;
}
}
Bây giờ xem xét đoạn mã này:
// 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();
Thực thể con được sai được chèn hai lần vào danh sách của trẻ em của thực thể mẹ.
Khi thực hiện một trong những điều sau đây, mã hoạt động tốt (không có mục trùng lặp trong danh sách):
- loại bỏ các thuộc tính
mappedBy
trong thực thể cha mẹ - thực hiện một số thao tác đọc thuộc danh mục con (ví dụ: dòng ghi chú được đánh dấu bởi
*
)
Đây rõ ràng là một hành vi rất lạ. Ngoài ra, khi sử dụng EclipseLink làm nhà cung cấp kiên trì, mã hoạt động như mong đợi (không có bản sao).
Đây có phải là lỗi Hibernate hoặc tôi thiếu gì đó không?
Cảm ơn
Bạn có thể thêm mã của phương pháp setParent và equals/phương pháp hashCode? –
Tôi vừa thêm các phương thức bạn đã yêu cầu. Tuy nhiên, tôi không nghĩ rằng vấn đề này có liên quan đến equals/hashCode. – user1014562
Phương thức equals của bạn không tôn trọng hợp đồng của Object.equals. Hơn nữa, hashCode thay đổi khi ID được tạo và gán cho thực thể. Tôi sẽ không ngạc nhiên nếu lỗi biến mất khi bạn xóa hashCode và bằng. BTW. Hibernate khuyến cáo không sử dụng ID để thực thi equals và hashCode. –