5.11.1 javax.persistence.EntityManagerインタフェース
javax.persistence.EntityManagerインタフェースの注事事項を説明します。
-
トランザクションスコープの永続化コンテキストを使用している場合,persist,merge,remove,refreshメソッドは,トランザクションコンテキスト内で呼び出す必要があります。トランザクションコンテキストが存在しない場合,javax.persistence.TransactionRequiredExceptionがスローされます。
-
find,getReferenceメソッドは,トランザクションコンテキスト外で呼び出すこともできます。トランザクションスコープの永続化コンテキストを使用している場合,結果のエンティティはdetached状態になります。拡張永続化コンテキストを使用している場合,結果のエンティティはmanaged状態になります。
-
EntityManagerから取得したQueryとEntityTransactionオブジェクトは,EntityManagerがオープンされている間,使用できます。
-
createQueryメソッドの引数が有効なJPQL(Java Persistence Query Language)でない場合,IllegalArgumentExceptionがスローされるか,クエリの実行が失敗します。ネイティブクエリが正しくない場合や,結果セットの定義がクエリの結果と互換性がない場合には,クエリが実行される時にPersistenceExceptionがスローされ,クエリの実行が失敗します。PersistenceExceptionは,可能な場合はデータベースの例外をラップしたものになっています。
-
EntityManagerインタフェースのメソッドでランタイム例外がスローされる場合,トランザクションはロールバックします。
-
close,isOpen,joinTransaction,getTransactionはアプリケーション管理のEntityManagerを管理するためのメソッドです。
-
EJB仕様では,Stateless Session Beanで,EntityManagerのメソッドを呼び出せるのは次のメソッドです。
-
ビジネスインタフェースまたはコンポーネントインタフェースのビジネスメソッド
-
ビジネスメソッド
-
インターセプタメソッド
-
タイムアウトコールバックメソッド
コンストラクタや,DIのセッターメソッド(setSessionContextメソッドを含む),ライフサイクルコールバックメソッド(PostConstructやPreDestroy)では,EntityManagerのメソッドを呼び出せません。許可されていない場所でEntityManagerのメソッドを呼び出した場合,KDJE56538-Eメッセージが出力され,java.lang.IllegalStateExceptionがスローされます。
-
-
EJB仕様では,Stateful Session BeanでEntityManagerのメソッドを呼び出せるのは,次のメソッドです。
-
ライフサイクルコールバックメソッド(PostConstructやPreDestroy)
-
ビジネスインタフェースまたはコンポーネントインタフェースのビジネスメソッド
-
ビジネスメソッド
-
インターセプタメソッド
-
SessionSynchronizationのafterBeginおよびbeforeCompletionメソッド
コンストラクタや,DIのセッターメソッド,SessionSynchronizationのafterCompletionメソッドでは,EntityManagerのメソッドを呼び出せません。許可されていない場所でEntityManagerのメソッドを呼び出した場合,KDJE56538-Eメッセージが出力され,java.lang.IllegalStateExceptionがスローされます。
-
なお,アプリケーションサーバでJPAを使用する場合は次の点にも注意してください。
-
アプリケーションがインジェクト,JNDIでのルックアップ,およびEntityManagerFactoryを使用して取得したEntityManagerは,JPAプロバイダが提供するEntityManagerオブジェクトではなく,アプリケーションサーバが提供するEntityManagerのプロキシクラスになっています。このプロキシクラスのgetDelegate()を使用すると,JPAプロバイダが提供するEntityManagerオブジェクトを取得できます。ただし,コンテナ管理のEntityManagerを使用する場合,EntityManagerのライフサイクルはコンテナが管理しているので,getDelegate()を使用して取得したEntityManagerオブジェクトのclose()をアプリケーションから呼ばないでください。
-
トランザクションスコープの永続化コンテキストを使用する場合で,トランザクションが存在しないときにEntityManagerのgetDelegate()を呼び出すと,コンテナは返されたEntityManagerをクローズできません。この場合には,アプリケーションでEntityManager.close()を呼び出す必要があります。