5.6.2 アプリケーションからEntityManagerをルックアップする方法

JNDIを使用してアプリケーションからEntityManagerをルックアップする場合,さらに次の2種類の方法があります。

  1. EntityManagerをルックアップするクラスに@PersistenceContextを付加して,EntityManagerのリファレンスを定義する方法
  2. DD(web.xml)で<persistence-context-ref>タグを定義して,EntityManagerのリファレンスを定義する方法

ただし,アプリケーションサーバではEJB3.0のejb-jar.xmlを使用したJPAの定義はできません。このため,EJBでJPAを使用する場合は,1.の方法で定義してください。

それぞれの方法について説明します。

<この項の構成>
(1) @PersistenceContextを使用する方法
(2) DDの<persistence-context-ref>を使用する方法

(1) @PersistenceContextを使用する方法

@PersistenceContextを使用してEntityManagerのリファレンスを定義する場合,ルックアップを実行するクラスに@PersistenceContextを付加します。

@PersistenceContextに指定できる属性について,次に説明します。

(a) name属性

name属性には,アプリケーションのコードがEntityManagerをルックアップするときのルックアップ名を指定します。指定するルックアップ名は,java:comp/envからの相対パスです。EntityManagerのルックアップ名は,必須ではありませんが,JPA仕様では,java:comp/env/persistence以下にすることが推奨されています。

@PersistenceContextのそのほかの属性については,「5.6.1 アプリケーションにEntityManagerをインジェクトする方法」と同じです。なお,拡張スコープのEntityManagerのルックアップは,Stateful Session Beanだけできます。また,一つのクラスに複数の@PersistenceContextを付加する場合には,クラスに@PersistenceContextsを付加し,そのvalue属性として@PersistenceContextの配列を指定してください。次に,@PersistenceContextを使用してSessionContextからEntityManagerをルックアップする例を示します。

@Stateless
@PersistenceContext(name="persistence/OrderEM")
public class MySessionBean implements MyInterface {
 @Resource SessionContext ctx;
 public void doSomething() {
   ・・・
   EntityManager em = (EntityManager)ctx.lookup("persistence/OrderEM");
   ・・・
 }
}

次に,@PersistenceContextを使用してInitialContextからEntityManagerをルックアップする例を示します。

@Stateless
@PersistenceContext(name="persistence/InventoryAppMgr")
public class InventoryManagerBean implements InventoryManager {
 public void updateInventory(...) {
   ・・・
   Context initCtx = new InitialContext();
   EntityManager em = (EntityManager)
     initCtx.lookup("java:comp/env/persistence/InventoryAppMgr");
   ・・・
 }
}

(2) DDの<persistence-context-ref>を使用する方法

DDを使用してEntityManagerのリファレンスを定義する場合,DDの<persistence-context-ref>タグに次に示すタグを定義します。

(a) <persistence-context-ref-name>タグ

<persistence-context-ref-name>タグには,アプリケーションのコードがEntityManager をルックアップするときのルックアップ名を指定します。指定するルックアップ名は,java:comp/envからの相対パスです。EntityManagerのルックアップ名は,必須ではありませんが,JPA仕様ではjava:comp/env/persistence以下にすることが推奨されています。

<persistence-context-ref>タグのそのほかのタグについては,「5.6.1 アプリケーションにEntityManagerをインジェクトする方法」と同じです。ただし,JNDIルックアップでEntityManager を取得する場合,<injection-target>は指定しません。なお,拡張スコープのEntityManagerのルックアップは,Stateful Session Beanからできます。

次に,web.xmlに<persistence-context-ref>を定義する例を示します。

...
<web-app>
 ...
 <servlet>
   <display-name>InventoryManagerServlet</display-name>
   <servlet-name>InventoryManagerServlet</servlet-name>
   <servlet-class>com.hitachi.InventoryManagerServlet</servlet-class>
 </servlet>
 ...
 <persistence-context-ref>
   <description>
     Persistence context for the inventory management application.
   </description>
   <persistence-context-ref-name>
     persistence/InventoryAppMgr
   </persistence-context-ref-name>
   <persistence-unit-name>InventoryManagement</persistence-unit-name>
   <persistence-context-type>Transaction</persistence-context-type>
 </persistence-context-ref>
 ...
</web-app>
...