从书临EJB3 JPA:在Java EE应用程序合并VS找到更新实体JPA
来处理最常见的策略本(-update实体 - )使用JPA是将结果的变化为分离的实体实例,并合并未决的改变成一个持久性上下文,以便它们可以被写入到数据库
实施例: 的EMP参数是一个分离ë ntity
@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);
}
}
然后说:
如果信息被udated量是非常小的,我们能避免分离的对象,并通过定位托管版本和手动复制合并()操作完全进入它的变化。
例子: 这里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()
。
好的,但是为什么?
数据库访问对于较大的对象来说是很昂贵的,因此它应该在分离模式下完成,以确保您不会对后端进行不必要的调用。 – hd1
而不是“emp.setEmpName(newName);”逐个设置字段。可以通过“emp = new Employee(//设置字段)”来完成吗? @请让我出来 –
是的,实际上setter/getters是规范可选的,你可以在构造函数上初始化参数或者使用流利的API,JPA会找到这些值。谨慎使用它;) – Sergio