gpt4 book ai didi

hibernate @OneToMany 与mappedBy(父子)关系和缓存问题

转载 作者:行者123 更新时间:2023-12-04 06:13:09 26 4
gpt4 key购买 nike

我有这个问题很长时间了,我已经在网上和SO进进出出搜索,但还没有找到解决方案。我希望你能帮助我。

我有两个实体之间的父子关系,如下所示:

@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()总是返回最新的子列表?

最佳答案

大多数 ORM 会以这种方式运行。

缓存中的对象不会从数据库更新(不必要的额外读取)。还可以将对象模型和持久性视为分开的。即保持您的对象模型与其自身一致,并且不要依赖持久性机制来为您执行此操作。

因此,如果您希望将对象添加到集合中,请在“setParent”代码中执行此操作。

在这种情况下,最佳实践实际上是让关系的一方做所有的工作,让另一方推迟。此外,我建议使用字段访问而不是方法访问​​,这样您就可以更灵活地自定义方法。

向父级添加一个名为 addChild 的方法

 public void addChild(Child child) {
child.setParent0(this);
getChildren().add(individualNeed);
}

然后在 Child 中设置 setParent:
public void setParent(Parent parent) {
parent.addChild(child);
}

Child 中的 setParent0 是 parent 对 child 的属性。
public void setParent0(Parent parent) {
this.parent = parent;
}

我还建议“getChildren”方法返回一个不可变的集合,这样开发人员就不会无意中不使用这个方法(我在这一切中学到了艰难的方法)。

还有一件事,你应该在上面的代码中有空检查代码和其他防御部分,为了清楚起见,我把它省略了。

关于 hibernate @OneToMany 与mappedBy(父子)关系和缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1206452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com