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

[目次][用語][索引][前へ][次へ]

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

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

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

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

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

<この項の構成>
(1) @PersistenceUnitを使用する方法
(2) DDの<persistence-unit-ref>タグを使用する方法

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

@PersistenceUnitを使用してEntityManagerFactoryのリファレンスを定義する場合,ルックアップを行うクラスに@PersistenceUnitを付加します。@PersistenceUnitに指定できる属性について説明します。

(a) name属性

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

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

@Stateless
@PersistenceUnit(name="persistence/InventoryAppDB")
public class InventoryManagerBean implements InventoryManager {
  @Resource SessionContext ctx;
  public void updateInventory(...) {
    ・・・
    EntityManagerFactory emf = (EntityManagerFactory)
      ctx.lookup("persistence/InventoryAppDB");
    EntityManager em = emf.createEntityManager();
    ・・・
  }
}
 

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

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

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

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

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

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

<persistence-unit-ref>のそのほかのタグについては,「5.7.1 アプリケーションにEntityManagerFactoryをインジェクトする方法」と同じです。ただし,JNDIルックアップでEntityManagerFactoryを取得する場合,<injection-target>タグは指定しません。次に,web.xmlに<persistence-unit-ref>を定義する例を示します。

...
<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>
  </persistence-unit-ref>
  ...
</web-app>
...