Tôi gặp vấn đề này trong một thời gian dài, tôi đã tìm kiếm trên web và SO vào và ra và không tìm thấy giải pháp nào. Tôi hy vọng bạn có thể giúp tôi về điều đó.Hibernate @OneToMany với mối quan hệ mappedBy (cha mẹ con) và vấn đề bộ nhớ cache
Tôi có một mối quan hệ cha-con giữa hai thực thể như sau:
@Entity
public class Parent {
// ...
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private Set<Child> children = new HashSet<Child>();
// ...
}
@Entity
public class Child {
// ...
@ManyToOne(fetch = FetchType.LAZY)
private Parent parent;
// ...
}
Điều được rằng khi tôi tạo ra một đứa trẻ mới và gán nó vào một phụ huynh, phụ huynh không được cập nhật khi nó đã có trong cache rồi.
Parent parent = new Parent();
em.persist(parent);
// ...
Child child = new Child();
child.setParent(parent);
em.persist(child);
parent.getChildren().size(); // returns 0
Tôi đã cố gắng sử dụng @PreUpdate để tự động thêm đứa trẻ cho phụ huynh khi trẻ được tồn, nhưng trong trường hợp khi chúng tôi có 2 nhà quản lý thực thể trong 2 chủ đề khác nhau (như trong JBoss), vấn đề này vẫn tồn tại, cho đến khi chúng tôi gọi em.refresh(parent)
Vì vậy, câu hỏi đặt ra là - có cách nào để loại bỏ vấn đề một cách suôn sẻ và đảm bảo rằng parent.getChildren()
luôn trả về danh sách cập nhật của trẻ em không?
Cảm ơn bạn đã trả lời sâu rộng của bạn, Michael. Tôi đã tìm thấy một số thông tin tốt trong đó. Nhưng, tôi e ngại, nó không giải quyết được vấn đề tôi có bởi vì hai cá thể EntityManager khác nhau giữ hai bộ đệm khác nhau và khi một trong số chúng cập nhật một cá thể thực thể, một cái khác không nhìn thấy bản cập nhật và thực thể được lưu trong bộ nhớ cache trở nên lỗi thời – artemb
Có vẻ như bạn cần phải xem xét các trình kích hoạt cập nhật mà sau đó sẽ lấy đối tượng đó và cập nhật bộ nhớ cache khác. Hoặc bạn có thể làm cho hai người lưu trữ thành viên của cùng một cụm nếu bạn lưu trữ bộ nhớ đệm giải pháp hỗ trợ phân cụm. –
Thật không may tôi không có quyền kiểm soát bộ nhớ cache phiên của Hibernate. Hay tôi? – artemb