本からPro EJB3 JPA:
Java JPAを使用するEEアプリケーション)でこれを処理する最も一般的な戦略は、変更の結果を分離されたエンティティインスタンスに配置し、保留中の変更を永続コンテキストにマージすることですデータベースに書き込むことができるように
例:emp param is adetached entity
_@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()
を作成してから、新しい値を1つずつ設定すると便利です。しかし、データの大きな更新(つまり、コレクション)の場合は、分離されたエンティティとそのすべての関係(CascadeType.Mergeを使用)があり、大きなmerge()
を実行することが推奨されます。
OK、でもなぜ?
分離されたオブジェクトを処理している場合、Beanに多数の属性がある場合、JPAはすべての属性について、マージプロセスで1つずつチェックします。
現在、属性が200のBeanがあり、フィールドを1つだけ変更したい場合、JPAが管理対象バージョンを取得する方が簡単です(内部的に、JPAは管理対象エンティティの1つのフィールドが「ダーティ」かどうかを知っています)。次に、その特定の属性のみを扱います。