Red Hat Training

A Red Hat training course is available for Red Hat JBoss Web Server

4.7. 自動ステータス検出

マージ操作はデタッチ済みのインスタンスのマージにより挿入または更新が必要になるかどうかを自動的に検出します。つまり、新しいインスタンス (およびデタッチ済みのインスタンス) を merge() に渡すことについて心配する必要はありません。この作業はエンティティマネージャが行います。
// In the first entity manager
Cat cat = firstEntityManager.find(Cat.class, catID);

// In a higher layer of the application, detached
Cat mate = new Cat();
cat.setMate(mate);

// Later, in a new entity manager
secondEntityManager.merge(cat);   // update existing state
secondEntityManager.merge(mate);  // save the new instance
新しいユーザーは merge() の使用方法とセマンティクスについて混乱するかもしれません。別の新しいエンティティマネージャの 1 つのエンティティマネージャでロードされたオブジェクトステータスを使用しない限り、merge() を使用しないでください。一部のアプリケーションはこのメソッドを使用しません。
通常、merge() は次のシナリオで使用されます。
  • アプリケーションは最初のエンティティマネージャでオブジェクトをロードします
  • オブジェクトはプレゼンテーション層に渡されます
  • いくつかの変更がオブジェクトに行われます
  • オブジェクトがビジネスロジック層に渡されます
  • アプリケーションはセカンダリエンティティマネージャで merge() を呼び出すことによりこれらの変更を永続化します
merge() の適切なセマンティックは以下のとおりです。
  • 永続コンテキストで現在関連付けられたのと同じ ID を持つ管理対象インスタンスが存在する場合は、該当するオブジェクトのステータスを管理対象インスタンスにコピーします。
  • 永続コンテキストに現在関連付けれた管理対象インスタンスが存在しない場合は、データベースからロードするか、新しい管理対象インスタンスを作成します。
  • 管理対象インスタンスが返されます
  • 該当するインスタンスが永続コンテキストに関連付けられてない場合、コンテキストはデタッチ済みのままになり、通常は破棄されます

注記

JPA でのマージはネイティブ Hibernate での saveOrUpdateCopy() メソッドに似ています。ただし、saveOrUpdate() メソッドとは同じではありません。該当するインスタンスは永続コンテキストに再びアタッチされず、管理対象インスタンスが merge() メソッドにより返されます。