Câu hỏi của tôi ở đây gần giống với câu hỏi khác của tôi Explicit delete on JPA relationships nhưng tôi đã nghĩ đơn giản hóa việc này để đảm bảo các câu trả lời chi tiết hơn.Tại sao việc hợp nhất không bị xếp chồng lên mối quan hệ một đến nhiều
Hãy tưởng tượng tôi có mối quan hệ OneToMany giữa cha mẹ và con.
@Entity
public class Parent {
private String name;
@OneToMany(mappedBy="owner",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private List<Child> children;
}
@Entity
public class Child {
private String name;
@ManyToOne
private Parent owner;
}
Trong giao diện người dùng của tôi, tôi hiển thị danh sách phụ huynh. Người dùng có thể chọn một phụ huynh và họ có thể chỉnh sửa danh sách các con của họ. Để hiển thị điều này, tôi đã sử dụng biến currentParent để đại diện cho phụ huynh hiện tại được chỉnh sửa. Người dùng có thể chọn thêm/chỉnh sửa tên của trẻ em.
Khi nhấp vào một nút, tôi sẽ lưu danh sách trẻ em mới bằng cách sử dụng cuộc gọi EJB.
@ViewScoped
public class MyBean(){
private Parent currentParent;
@EJB
private MyEJB myEJB;
public void saveChanges(){
myEJB.save(currentParent);
}
}
Cuộc gọi EJB của tôi trông như thế này.
@Stateless
public class MyEJB{
@PersistenceContext(unitName = "MyPU")
private EntityManager em;
public void save(Parent parentNew){
Parent pOld = em.find(entityClass, p.getId());
if(pOld !=null){
pOld.setName(parentNew.getName());
pOld.setChildren(parentNew.getChildren());
em.merge(pOld);
}
}
}
Vấn đề của tôi là, tôi có thể thay đổi tên của cha mẹ nhưng bất kỳ thay đổi nào đối với danh sách trẻ em không được phản ánh trong DB. Nó không thay đổi hoặc thực thi bất kỳ SQL nào để xóa/cập nhật/thêm các child.
Nguyên nhân có thể là gì?
Cập nhật:
Vâng sau khi một số dùng thử và và đọc qua lỗi liên kết khác nhau, có vẻ như thiết lập tùy chọn orphanRemoval trong @onetomany tôi sẽ giải quyết vấn đề của tôi. Eclipselink tự động xóa các hàng mồ côi trong quá trình hợp nhất.
Vì vậy, nhiều cho JPA phức tạp ..
@Entity
public class Parent {
private String name;
@OneToMany(mappedBy="owner",cascade=CascadeType.ALL, fetch=FetchType.EAGER,orphanRemoval = true)
private List<Child> children;
}
Có thể điều này sẽ giúp: http://stackoverflow.com/questions/10656765/handling-collection-updates-with-jpa – JMelnik
Xin chào, tôi không chắc chắn nếu tôi nhận được câu trả lời từ liên kết đó, vì vậy bạn có nghĩa là tôi có để lặp qua các bộ sưu tập và lưu nó từng người một? Tôi thực sự nghĩ rằng eclipselink sẽ xử lý việc tiết kiệm bộ sưu tập của tôi? Vì vậy, ví dụ tôi có 5 trẻ em trong một thực thể, và sau đó tôi chỉnh sửa nó chỉ với hai con, khi tôi gọi hoạt động hợp nhất, nó sẽ chăm sóc xóa/thêm các hàng. Cảm ơn –