5.5.1 EntityManagerと永続化コンテキスト
EntityManagerと永続化コンテキストの関係を次の図に示します。
EntityManagerは,永続化コンテキストの中にmanaged状態のエンティティオブジェクトを入れて管理しています。アプリケーションがエンティティオブジェクトをpersistメソッドに渡したときや,managed状態のエンティティオブジェクトについてフィールドの値を更新すると,永続化コンテキスト内のエンティティオブジェクトの状態が変更されます。EntityManagerは,トランザクションがコミットされる直前に,永続化コンテキスト内のエンティティオブジェクトとデータベースのテーブルの状態を同期させます。永続化コンテキスト内のエンティティオブジェクトの状態をデータベースのテーブルに反映するために,このときにまとめて更新SQLを発行します。これによって,データベースのロックの期間を短くできるので,同時実行性を向上したり,効率良くデータを更新したりできます。
- 〈この項の構成〉
(1) EntityManagerの種類
永続化コンテキストとトランザクションの関係によって,コンテナ管理のEntityManagerとするか,アプリケーション管理のEntityManagerにするかを決めます。
-
永続化コンテキストがJTAトランザクションとともに自動的に伝播する必要がある場合
コンテナ管理のEntityManagerを使用します。コンテナ管理のEntityManagerを使用すると,永続化コンテキストがJTAトランザクションとともに自動的に伝播されます。このため,一つのJTAトランザクションの中で複数のコンポーネントが呼ばれた場合に,同じJTAトランザクションの中で使用されるEntityManagerは同じ永続化コンテキストに関連づけることができます。
これによって,アプリケーションはEntityManagerのリファレンスを,コンポーネントから別のコンポーネントに呼び出すときの引数に渡す必要がありません。
-
アプリケーションがJTAトランザクションとは独立した永続化コンテキストを使用する必要がある場合
アプリケーション管理のEntityManagerを使用します。アプリケーション管理のEntityManagerを使用すると,同じJTAトランザクションの中で別のEntityManagerを使用したときでも,これらのEntityManagerは永続化コンテキストを共有しないで,独立した永続化コンテキストを持ちます。