Hitachi

Cosminexus V11 アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)


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を使用する方法

@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>
...