我有這個問題很長一段時間了,我已經搜索了網絡和SO進出,並沒有找到解決方案。我希望你能幫助我。Hibernate @OneToMany與mappedBy(父子)關係和緩存問題
我有這樣兩個實體之間的父子關係如下:
@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;
// ...
}
的事情是,當我創建一個新的子並將其分配給家長,家長沒有更新時它已經在緩存中了。
Parent parent = new Parent();
em.persist(parent);
// ...
Child child = new Child();
child.setParent(parent);
em.persist(child);
parent.getChildren().size(); // returns 0
我曾嘗試使用@PreUpdate自動將孩子添加到父當孩子堅持,但在情況下,當我們在2級不同的線程2個的實體管理器(如在JBoss中),發行仍然存在,直到我們致電em.refresh(parent)
所以問題是 - 是否有辦法平穩消除問題並確保parent.getChildren()
始終返回最新的兒童列表?
找到謝謝您的回答廣泛,邁克爾。我發現了一些很好的信息。但是,恐怕它並不能解決我遇到的問題,因爲兩個不同的EntityManager實例擁有兩個不同的緩存,並且當其中一個更新實體實例時,另一個不會看到更新並且它的緩存實體變得過時 – artemb 2009-07-30 15:31:19
聽起來就像你需要看更新觸發器,然後採取該對象並更新其他緩存。或者,如果您緩存解決方案suports羣集,則可以讓這兩個緩存成員位於同一個羣集中。 – 2009-07-30 15:46:16
不幸的是,我無法控制Hibernate的會話緩存。或者我有嗎? – artemb 2009-07-31 07:21:27