5.5.3 アプリケーション管理のEntityManagerを使用する場合の永続化コンテキスト
アプリケーション管理のEntityManagerを使用する場合,アプリケーションがJPAプロバイダのEntityManagerFactoryを直接呼び出して,EntityManagerのライフサイクルおよび永続化コンテキストの作成や破棄を管理します。アプリケーション管理の永続化コンテキストのライフサイクルは,複数のトランザクションにわたったライフサイクルを管理できます。
(1) EntityManagerのライフサイクルの管理
アプリケーションではEntityManagerのcloseメソッドやisOpenメソッドを使用して,アプリケーション管理のEntityManagerのライフサイクルを管理します。EntityManagerのcloseメソッドが呼ばれると,EntityManager,EntityManagerに関連づいた永続化コンテキストやそのほかのリソースが解放されます。closeメソッドを呼び出したあとは,アプリケーションではEntityManagerのgetTransactionメソッドとisOpenメソッド以外のメソッドを呼び出さないでください。呼び出した場合は,IllegalStateExceptionがスローされます。トランザクションがアクティブのときにcloseメソッドを呼び出した場合は,トランザクションが決着するまで永続化コンテキストは保持されたままとなります。EntityManagerのisOpenメソッドは,EntityManagerがクローズされるまではtrueを返し,クローズされたあとはfalseを返します。
(2) 永続化コンテキストのライフサイクル
アプリケーション管理の永続化コンテキストのライフサイクルを次に示します。
-
永続化コンテキストの作成
EntityManagerFactoryのcreateEntityManagerメソッドが呼ばれたときに作成されます。
-
永続化コンテキストの破棄
EntityManagerのcloseメソッドが呼ばれたときに破棄されます。
アプリケーション管理の永続化コンテキストは,トランザクションとは独立した永続化コンテキストです。このため,JTAトランザクションとともに伝播されることはありません。
(3) JTAエンティティマネージャを使用する場合の注意
アプリケーション管理のEntityManagerでJTAエンティティマネージャを使用する場合,アプリケーションがEntityManagerをJTAトランザクションのスコープの外で作成するときは,EntityManagerのjoinTransactionを呼ぶのはアプリケーションの責任になります。アプリケーションはEntityManagerにトランザクションが開始されたことを通知する必要があるので,トランザクション開始後にEntityManagerのjoinTransactionメソッドを呼んでください。