合并与查找以更新实体 JPA
2022-09-02 13:49:13
摘自《Pro EJB3 JPA》一书:
在使用 JPA 的 Java EE 应用程序中,处理此问题(-更新实体-)的最常见策略是将更改的结果放入分离的实体实例中,并将挂起的更改合并到持久性上下文中,以便可以将它们写入数据库
示例: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);
}
}
然后,说:
如果正在接收的信息量非常小,我们可以通过定位托管版本并手动将更改复制到其中来完全避免分离的对象和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);
}
因此,看起来对于小的更新和创建操作的策略,然后逐个设置新值是方便的。但是!,对于数据(即集合)的大更新,最好有一个独立的实体和它的所有关系(与CascadeType.Merge)并做一个大的.find()
merge()
好吧,但为什么呢?