4.6. デタッチ済みのオブジェクトの変更
多くのアプリケーションは、 1 つのトランザクションで 1 つのオブジェクトを取得し、操作のためにプレゼンテーション層に送信し、新しいトランザクションで変更を保存する必要があります。ユーザーがトランザクションとトランザクションの間に考える場合は、待機時間が非常に長くなることがあります。高同時実行環境でこのような方法を使用するアプリケーションは、通常「長い」単位の作業を分離するために、バージョン管理されたデータを使用します。
JPA 仕様では、
EntityManager.merge() メソッドを使用してデタッチ済みのインスタンスに行われる変更の永続化を提供することにより、この開発モデルがサポートされます。
// in the first entity manager
Cat cat = firstEntityManager.find(Cat.class, catId);
Cat potentialMate = new Cat();
firstEntityManager.persist(potentialMate);
// in a higher layer of the application
cat.setMate(potentialMate);
// later, in a new entity manager
secondEntityManager.merge(cat); // update cat
secondEntityManager.merge(mate); // update mate
merge() メソッドは、永続コンテキストのステータスを考慮せずにデタッチ済みのインスタンスに行われた変更を対応する管理対象インスタンスにマージします。つまり、マージされたオブジェクトステータスは、永続エンティティステータスをオーバーライドします (すでに存在する場合)。アプリケーションは、該当するデタッチ済みのインスタンスから到達可能なデタッチ済みのインスタンスに対して merge() を個別に使用します (ステータスを保持したい場合)。これは、推移の永続化を使用して関連するエンティティとコレクションにカスケードできます (「遷移の永続化」 を参照)。