【发布时间】:2015-09-11 01:24:16
【问题描述】:
我有一个像下面这样的类:
@Entity
@Table(name="work")
public class Work {
@Id
@Column(name="id")
private String id;
@OneToMany(orphanRemoval=true ,mappedBy="work", cascade=CascadeType.ALL , fetch=FetchType.EAGER)
private List<PersonRole> personRoleList;
}
由于我是一个网络应用程序,当我更新(来自客户端)personRoleList 项目并调用时:
session.update(work); //`work` is in detached state
它不会更新现有的personRoleList 项目它实际上添加了一个新项目。
其他一些人也有同样的问题。联系人:
using-saveorupdate-in-hibernate-creates-new-records-instead-of-updating-existi
jpa-onetomany-not-deleting-child
我尝试了所有建议的解决方案,但没有一个对我有用。
但是然后我就试过了:
session.merge(work); //replacing session.update(work)
它按预期工作。!!
这就是我感到困惑的地方。因为对于这种 OneToMany 关系中的行为差异,我找不到任何解释(或者我可能错过了)。我阅读了一些主题以了解update() 和merge() 之间的区别并阅读了文档。参考:
what-are-the-differences-between-the-different-saving-methods-in-hibernate
differences-among-save-update-saveorupdate-merge-methods-in-session
但仍不清楚造成这种差异的行为模式/逻辑/步骤是什么?
【问题讨论】:
-
当您使用分离的实体时,您有可能拥有多个实体。现在,当您想要持久化更改时,您需要告诉 hibernate 应该进行哪些更改,因为可能有多个脏版本。因此,您必须使用合并来进行正确的更改。
-
您是在询问存在这些不同方法的原因,还是询问合并有效而更新无效的原因?
-
我在问为什么合并有效而更新无效? @泰勒