merge vs find更新实体JPA

时间:2014-01-17 00:03:39

标签: java java-ee jpa persistence

Pro EJB3 JPA

一书中
  

在使用JPA的Java EE应用程序中处理此(-update实体)的最常见策略是将更改的结果放入分离的实体实例中,并将挂起的更改合并到持久性上下文中,以便可以编写它们到数据库

实施例: \ temp 参数是一个分离的实体

@Stateless
public class EmployeeServiceBean {
    @PersistenceContext
    EmtityManager em;

    public void updateEmployee(Employee emp){
       if(em.find(Employee.class, emp.getId()) == null){
           throw new IllegalArgumentException("Unknown Employee id")
       }

       em.merge(emp);
    }
}

然后,说:

  

如果使用的信息量非常小,我们可以完全避免分离对象和merge()操作,方法是找到托管版本并手动将更改复制到其中。

实施例: 此处 emp 已附加

public void updateEmployee(int id, String newName, long newSalary) {
    Employee emp = em.find(Employee.class, id);
    if(emp==null){
        throw new IllegalArgumentException("Unknown Employee id")
    }
    emp.setEmpName(newName);
    emp.setSalary(newSalary);
}

因此,看起来像小更新并创建操作策略find()然后逐个设置新值很方便。但是!对于数据的大更新(即集合),首选的是具有分离的实体及其所有关系(使用CascadeType.Merge)并执行大的merge()

好的,但为什么

1 个答案:

答案 0 :(得分:12)

因为如果你的bean有很多属性,如果你正在处理一个分离的对象,JPA将在合并过程中逐个检查所有属性。

现在,如果您有一个包含200个特征的bean并且只想更改1个字段,则JPA更容易获得托管版本(在内部,JPA知道托管实体的一个字段何时“脏”或不),那么它只会处理那个特定的属性。