8.4.4 データベースからのエンティティの取得
EntityManagerのfindメソッドまたはgetReferenceメソッドの呼び出しによって,引数で指定した主キーに対応するエンティティをデータベースから取得できます。
EntityManagerのfindメソッドまたはgetReferenceメソッドで返されるエンティティは,トランザクションスコープの永続化コンテキストを利用します。このため,トランザクション内でメソッドを呼び出した場合はmanaged状態になります。また,トランザクション外でfindメソッドまたはgetReferenceメソッドを呼び出した場合はdetached状態になります。
find操作またはgetReference操作で取得したエンティティの状態を次の表に示します。
永続化コンテキスト |
取得したエンティティの状態 |
---|---|
トランザクションスコープの永続化コンテキスト(トランザクション外) |
detached |
トランザクションスコープの永続化コンテキスト(トランザクション内) |
managed |
拡張された永続化コンテキスト(トランザクション外) |
managed |
拡張された永続化コンテキスト(トランザクション内) |
managed |
なお,CJPAプロバイダの場合,find操作またはgetReference操作では次の点がJPA仕様と異なります。なお,このほかにJPA仕様との機能差はありません。
-
JPA仕様では,EntityManagerのgetReferenceメソッドでは実際のインスタンスではなく,引数で与えられた主キーに対応するエンティティにProxyを返すことができます。ただし,CJPAプロバイダでは,@Basicに対するLazyローディングをサポートしていません。このため,CJPAプロバイダでは,getReferenceの戻り値として,Proxyではなくエンティティインスタンスを返します。
なお,リレーションシップに対するLazyローディングのサポート範囲については,「8.4.5(2) データベースからのエンティティ情報の読み込み」を参照してください。
-
CJPAプロバイダでは,findメソッドとgetReferenceメソッドの間で存在しないエンティティを引数に指定した場合,findメソッドではnull値が返ります。また,getReferenceメソッドではEntityNotFoundExceptionが発生します。