为什么merge()返回复制对象?

Ras*_*ema 3 hibernate jpa jpa-2.0 jpa-2.1

我是JPA的新手,请阅读EntityManager中提供的merge方法,当我们尝试合并一个分离的对象时,该方法会返回一个复制对象。为什么返回一个复制对象?

我尝试分离一个托管对象,发现分离的对象的哈希码与merge方法返回的对象的哈希码不同。

Employee emp = new Employee();
emp.setName("Name");

em.persist(emp);

emp = em.find(Employee.class, emp.getId());
em.detach(emp);

emp.setName("New Name");

int empHashCode = emp.hashCode();

Employee managedEmp = em.merge(emp);
int managedHashCode = managedEmp.hashCode();

if(empHashCode == managedHashCode){
    System.out.println("Hash Code Equal");
} else{
    System.out.println("Hash Code not Equal");
}
Run Code Online (Sandbox Code Playgroud)

输出为“哈希码不相等”。这意味着两个对象都不同,但是为什么呢?

yas*_*2yj 5

merge()返回复制对象,请参见以下说明

在由持久性上下文管理实体时,应用程序可能无法直接从多个线程访问该实体。但是,应用程序可以选择允许在实体分离时同时访问它们。如果选择这样做,则必须通过实体上编码的方法来控制同步。但是,不建议使用并发实体状态访问,因为实体模型不能很好地适合于并发模式。最好是简单地复制实体,然后将复制的实体传递给其他线程进行访问,然后在需要持久化时将所有更改合并回持久性上下文中。

以上说明摘自“ Java EE 8中的Pro JPA 2:Java持久性API深入指南”