5.10.2 永続化ユニット名の参照スコープ
アプリケーションに含まれるEJBやサーブレットなどのコンポーネントは,@PersistenceUnitや@PersistenceContextのunitName属性,DDに定義した<persistence-context-ref>タグ下または<persistence-unit-ref>タグ下の<persistence-unit-name>タグで永続化ユニット名を指定して,使用する永続化ユニットを参照します。ただし,各コンポーネントから参照できる永続化ユニットのスコープは,次のとおりになります。
-
EJB-JARまたはWARの中に定義した永続化ユニットは,EJB-JARまたはWARに含まれているコンポーネントから参照できます。
-
EARの中に定義した永続化ユニットは,EARに含まれるすべてのコンポーネントから参照できます。
EARで定義した永続化ユニットの名前と,EJB-JARまたはWARで定義した永続化ユニットの名前が重複している場合,EJB-JARまたはWAR内のコンポーネントからは,より狭い範囲で定義された永続化ユニットが優先されます。例えば,EARとWAR内に同じ名前の永続化ユニットが定義されている場合,WARに含まれているコンポーネントからは,WARで定義した永続化ユニットが優先して見えます。EARの中にある永続化ユニットは見えません。
(1) 永続化ユニット名を省略した場合に使用される永続化ユニット
アプリケーションサーバでJPAを使用する場合,コンポーネントが参照する永続化ユニット名を省略すると,次に示すルールで使用する永続化ユニットが決定されます。
-
コンポーネントが含まれるEJB-JARまたはWARの中に,永続化ユニットが一つだけ定義されている場合は,その永続化ユニットが使用されます。
-
コンポーネントが含まれるEJB-JARまたはWARの中に,永続化ユニットが一つも定義されていなく,EAR内に永続化ユニットが一つだけ定義されている場合は,EAR内の永続化ユニットが使用されます。
なお,次の条件に該当する場合は,使用する永続化ユニットを一つに特定できないため,永続化ユニット名は省略できません。
-
コンポーネントが含まれるEJB-JARまたはWARの中に,永続化ユニットが二つ以上定義されている場合
-
コンポーネントが含まれるEJB-JARまたはWARの中に,永続化ユニットが一つも定義されていなく,EAR内に永続化ユニットが二つ以上定義されている場合
(2) 「#」文法を使用したEARレベル永続化ユニットの明示的な参照
EARで定義した永続化ユニットの名前と,EJB-JARまたはWARで定義した永続化ユニットの名前が重複している場合,EJB-JARまたはWAR内のコンポーネントからは,より狭い範囲で定義された永続化ユニットが優先して見えます。ただし,永続化ユニットの参照名に「#」文法を使用することで,EARに定義した永続化ユニットを明示的に参照することもできます。「#」文法を使用する場合,永続化ユニット名は次のとおり指定します。
「コンポーネントが含まれるEJB-JARやWARから永続化ユニットルートへの相対パス」#「永続化ユニット名」
例えば,EARのejbs/myEjbs.jarに含まれたEJBから,EARのlib/persistenceUnitRoot.jarに含まれた永続化ユニット「myPersistenceUnit」を参照する場合,参照する永続化ユニット名は「../lib/persistenceUnitRoot.jar#myPersistenceUnit」になります。