web-dev-qa-db-ja.com

エンティティのJPAを更新するためのマージと検索

本から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、でもなぜ

18
Sergio

分離されたオブジェクトを処理している場合、Beanに多数の属性がある場合、JPAはすべての属性について、マージプロセスで1つずつチェックします。

現在、属性が200のBeanがあり、フィールドを1つだけ変更したい場合、JPAが管理対象バージョンを取得する方が簡単です(内部的に、JPAは管理対象エンティティの1つのフィールドが「ダーティ」かどうかを知っています)。次に、その特定の属性のみを扱います。

13
user1073494