从 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()
。
好的,但为什么?
答案 0 :(得分:12)
因为如果你的bean有很多属性,如果你正在处理一个分离的对象,JPA将在合并过程中逐个检查所有属性。
现在,如果您有一个包含200个特征的bean并且只想更改1个字段,则JPA更容易获得托管版本(在内部,JPA知道托管实体的一个字段何时“脏”或不),那么它只会处理那个特定的属性。