5.7.1 アプリケーションにEntityManagerFactoryをインジェクトする方法
アプリケーションのフィールドやsetterメソッドにEntityManagerFactoryをインジェクトする場合,さらに次の2種類の方法があります。
-
@PersistenceUnitをインジェクト先のフィールドまたはメソッドに付加する方法
-
DD(web.xml)の<persistence-unit-ref>タグで定義する方法
ただし,アプリケーションサーバではEJB3.0のejb-jar.xmlを使用したJPAの定義はできません。このため,EJBでJPAを使用する場合は,1.の方法で定義してください。
それぞれの方法について説明します。
(1) @PersistenceUnit を使用する方法
@PersistenceUnitを使用してEntityManagerFactoryをインジェクトする場合,インジェクト先のフィールドやsetterメソッドに@PersistenceUnitを付加します。@PersistenceUnitに指定できる属性について説明します。
(a) unitName属性
unitName属性には,persistence.xmlで定義された永続化ユニットの名前を指定します。ただし,EJB-JARやWAR,EAR内に一つだけ永続化ユニットが定義されている場合など,使用する永続化ユニットが一意に特定できる場合には,unitName属性を省略できます。unitName属性を省略した場合に,どの永続化ユニットが使用されるかについては,「5.10.2 永続化ユニット名の参照スコープ」を参照してください。
(b) name属性
インジェクションを使用する場合,通常name属性を指定する必要はありませんが,指定した場合には,name属性に指定した名前でEntityManagerがJNDI 名前空間(java:comp/env)に登録されます。次に,@PersistenceUnit を使用してEntityManagerFactory をインジェクトする例を示します。
@Stateless public class InventoryManagerBean implements InventoryManager { @PersistenceUnit(unitName="myUnit") private EntityManagerFactory emf; ・・・ }
(2) DDの<persistence-unit-ref>タグを使用する方法
DDを使用してEntityManagerFactoryをインジェクトする場合,DDの<persistence-unit-ref>タグに次に示すタグを定義します。
(a) <persistence-unit-ref-name>タグ
<persistence-unit-ref-name>タグには,EntityManagerFactoryがJNDI名前空間に登録されるときの名前を指定します。指定する名前は,java:comp/envからの相対パスです。
EntityManagerFactoryのJNDI登録名は必須ではありませんが,JPA仕様では,java:comp/env/persistence以下にすることが推奨されています。
(b) <description>タグ
<description>タグには,定義するEntityManagerFactoryリファレンスの説明をユーザが自由に記述できます。このエレメントを指定した場合でも,指定した内容がアプリケーションの動作に影響を与えることはありません。また,このタグは省略できます。
(c) <persistence-unit-name>タグ
<persistence-unit-name>タグには,persistence.xmlに定義された永続化ユニットの名前を指定します。EJB-JARやWAR,EAR内に一つだけ永続化ユニットが定義されている場合など,使用する永続化ユニットを一意に特定できる場合には,<persistence-unit-name>タグは省略できます。<persistence-unit-name>タグを省略した場合に,どの永続化ユニットが使用されるかについては,「5.10.2 永続化ユニット名の参照スコープ」を参照してください。
(d) <injection-target>タグ
<injection-target>タグの<injection-target-class>タグにはインジェクト先のクラスを指定します。<injection-target>タグの<injection-target-name>タグには,インジェクト先のフィールド名またはsetterメソッド名を指定します。次に,web.xmlに<persistence-unit-ref>を定義してEntityManagerFactory をインジェクトする例を示します。
... <web-app> ... <servlet> <display-name>InventoryManagerServlet</display-name> <servlet-name>InventoryManagerServlet</servlet-name> <servlet-class>com.hitachi.InventoryManagerServlet</servlet-class> </servlet> ... <persistence-unit-ref> <description> Persistence unit for the inventory management application. </description> <persistence-unit-ref-name>persistence/InventoryAppDB </persistence-unit-ref-name> <persistence-unit-name>InventoryManagement</persistence-unit-name> <injection-target> <injection-target-class> com.hitachi.InventoryManagerServlet </injection-target-class> <injection-target-name>emf</injection-target-name> </injection-target> </persistence-unit-ref> ... </web-app> ...