Red Hat Training

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

5.4.2. 拡張されたエンティティマネージャと自動バージョン機能

単一の永続コンテキストはアプリケーショントランザクション全体に使用されます。エンティティマネージャはフラッシュ時にインスタンスバージョンをチェックし、同時の変更が検出された場合に例外をスローします。開発者は、例外を捕捉し、処理する必要があります (一般的なオプションは、ユーザーが変更をマージするか、無効でないデータでビジネスプロセスを再開することです)。
EXTENDED 永続コンテキストで、アクティブなトランザクション外部で実行されたすべての操作がキューに格納されます。EXTENDED 永続コンテキストはアクティブなトランザクションで実行されたとき (最悪の場合はコミット時) にフラッシュされます。
Entity Manager は、ユーザーとの対話の待機中に基礎となる JDBC 接続から切断されます。アプリケーションにより管理された拡張エンティティマネージャでは、これはトランザクション完了時に自動的に行われます。コンテナにより管理された拡張エンティティマネージャ (つまり、@PersistenceContext(EXTENDED) でアノテートされた SFSB) を保持するステートフルセッション Bean では、これは透過的に行われます。この方法は、データベースアクセスの点で最も効率的です。アプリケーションではバージョンチェックやデタッチされたインスタンスのマージについて心配する必要がなく、各データベーストランザクションでインスタンスをリロードする必要もありません。オープンおよびクローズされた接続の数について心配する場合は、パフォーマンスの影響がないよう接続プロバイダを接続プールにする必要があることに注意してください。以下の例は、非管理環境のイディオムを示しています。
// foo is an instance loaded earlier by the extended entity manager
em.getTransaction().begin(); // new connection to data store is obtained and tx started
foo.setProperty("bar");
em.getTransaction().commit();  // End tx, flush and check version, disconnect
foo オブジェクトはロードされた persistence context を認識します。getTransaction.begin(); を使用してエンティティマネージャは新しい接続を取得し、永続コンテキストを再開します。メソッド getTransaction().commit() は、チェックバージョンをフラッシュするだけでなく JDBC 接続からエンティティマネージャを切断し、接続をプールに返します。
ユーザーが考える間に永続コンテキストが大きすぎて保存できず、保存する場所がわからない場合、このパターンは問題となります。たとえば、HttpSession はできるだけ小さくする必要があります。永続コンテキストは (必須の) 一次キャッシュであり、ロードされたすべてのオブジェクトを含むため、この方針は少ない要求/応答サイクルに対してのみ使用できます。これは、永続コンテキストが無効なデータを持つため、推奨されます。
要求時に拡張エンティティマネージャを保存する場所はユーザーが決めることができます。JPA コンテナ内部で、上述したようにステートフルセッション Bean を使用します。HttpSession に保存するために Web レイヤーには送信しないでください (または異なる層に対してシリアル化しないでください)。非管理 2 層環境では、HttpSession が保存に適した場所である場合があります。