合并与查找以更新实体 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()

好吧,但为什么呢


答案 1

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

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


答案 2

推荐