我有这个问题很长一段时间了,我已经搜索了网络和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