Hitachi

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


5.6.1 アプリケーションにEntityManagerをインジェクトする方法

アプリケーションのフィールドやsetterメソッドにEntityManagerをインジェクトする場合,さらに次の2種類の方法があります。

  1. @PersistenceContextをインジェクト先のフィールドまたはメソッドに付加する方法

  2. DD(web.xml)の<persistence-context-ref>タグで定義する方法

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

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

〈この項の構成〉

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

@PersistenceContextを使用してEntityManagerをインジェクトする場合,インジェクト先のフィールドやsetterメソッドに@PersistenceContextを付加します。@PersistenceContextに指定できる属性について,次に示します。

(a) unitName属性

unitName属性には,persistence.xmlで定義された永続化ユニットの名前を指定します。ただし,EJB-JARやWAR,EAR内に一つだけ永続化ユニットが定義されている場合など,使用する永続化ユニットが一意に特定できる場合には,unitName属性を省略できます。unitName属性を省略した場合に,どの永続化ユニットが使用されるかについては,「5.10.2 永続化ユニット名の参照スコープ」を参照してください。

(b) type属性

type属性には,永続化コンテキストのライフサイクルの種類を指定します。指定できる種類は,PersistenceContextType.TRANSACTIONまたはPersistenceContextType.EXTENDEDです。

  • PersistenceContextType.TRANSACTIONを指定した場合

    トランザクションスコープの永続化コンテキストが使用され,トランザクションの生存期間と永続化コンテキストの生存期間が同じになります。

  • PersistenceContextType.EXTENDEDを指定した場合

    拡張永続化コンテキストが使用され,Stateful Session Beanの生存期間と永続化コンテキストの生存期間が同じとなります。

    なお,type属性にPersistenceContextType.EXTENDEDを指定した@PersistenceContextは,Stateful Session Beanのフィールドまたはメソッドにだけ付けることができます。

type属性を省略した場合のデフォルトは,PersistenceContextType.TRANSACTIONです。

(c) properties属性

properties属性には,永続化ユニットを設定するためのJPAプロバイダ用のプロパティを指定できます。ここに指定したプロパティは,JPAプロバイダからEntityManagerを取得するときに,JPAプロバイダに渡されます。

(d) name属性

インジェクションを使用する場合,通常name属性を指定する必要はありませんが,指定した場合には,name属性に指定した名前でEntityManagerがJNDI名前空間(java:comp/env)に登録されます。@PersistenceContextを使用してEntityManagerをインジェクトする例を次に示します。

@Stateless
public class InventoryManagerBean implements InventoryManager {
  @PersistenceContext(unitName="myUnit")
  private EntityManager em;
  ・・・
}

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

DDを使用してEntityManagerをインジェクトする場合,DDの<persistence-context-ref>タグに次に示すタグを定義します。

(a) <description>タグ

<description>タグには,定義するEntityManagerリファレンスの説明をユーザが自由に記述できます。このタグを指定した場合でも,指定した内容がアプリケーションの動作に影響を与えることはありません。また,このタグは省略できます。

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

<persistence-context-ref-name>タグには,EntityManagerがJNDI名前空間に登録されるときの名前を指定します。指定する名前は,java:comp/envからの相対パスです。EntityManagerのJNDI登録名は必須ではありませんが,JPA仕様では,java:comp/env/persistence以下にすることが推奨されています。

(c) <persistence-unit-name>タグ

<persistence-unit-name>タグには,persistence.xmlに定義された永続化ユニットの名前を指定します。EJB-JARやWAR,EAR内に一つだけ永続化ユニットが定義されている場合など,使用する永続化ユニットを一意に特定できる場合には,<persistence-unit-name>タグは省略できます。<persistence-unit-name>タグを省略した場合に,どの永続化ユニットが使用されるかについては,「5.10.2 永続化ユニット名の参照スコープ」を参照してください。

(d) <persistence-context-type>タグ

<persistence-context-type>タグには,永続化コンテキストのライフサイクルの種類を指定します。「Transaction」または「Extended」を指定します。

  • 「Transaction」を指定した場合

    トランザクションスコープの永続化コンテキストが使用され,トランザクションの生存期間と永続化コンテキストの生存期間が同じになります。

  • 「Extended」を指定した場合

    拡張永続化コンテキストが使用され,Stateful Session Beanの生存期間と永続化コンテキストの生存期間が同じとなります。

    なお,<persistence-context-type>タグに「Extended」を指定した<persistence-context-ref>タグは,Stateful Session Beanに対してだけ定義できます。

<persistence-context-type>タグを省略した場合のデフォルトは,「Transaction」になります。

(e) <persistence-property>タグ

<persistence-property>タグには,永続化ユニットを設定するためのJPAプロバイダ用のプロパティを指定できます。ここに指定したプロパティは,JPAプロバイダからEntityManagerのファクトリを取得するときに,JPAプロバイダに渡されます。このタグは省略できます。

(f) <injection-target>タグ

<injection-target>タグの<injection-target-class>タグにはインジェクト先のクラスを指定します。<injection-target>タグの<injection-target-name>タグには,インジェクト先のフィールド名またはsetterメソッド名を指定します。web.xmlに<persistence-context-ref>タグを定義してEntityManagerをインジェクトする例を次に示します。

...
<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>
    <injection-target>
      <injection-target-class>
        com.hitachi.InventoryManagerServlet
      </injection-target-class>
      <injection-target-name>em</injection-target-name>
    </injection-target>
  </persistence-context-ref>
  ...
</web-app>
...