merge vs find更新实体JPA



来自Pro EJB3 JPA

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

示例:emp参数是一个分离的实体

@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);
}
}

然后,说:

如果被udad的信息量很小,我们可以通过定位托管版本并手动将更改复制到其中来完全避免分离对象和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()

好的,但是为什么

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

现在,如果您有一个具有200个atrributes的bean,并且只想更改1个字段,那么JPA更容易获得托管版本(在内部,JPA知道托管实体的一个字段何时是"脏"的),那么它将只处理该特定属性。

最新更新