JBoss EJB 3.0と拡張機能

  永続コンテキストの設定
はじめに

アプリケーションのエンティティBeanをデプロイするには、それらのクラスファイルをJARファイルにパッケージするだけでできます。EJB 3.0仕様は、そのJARファイルのMETA-INFディレクトリにpersistence.xmlも要求しています。そのpersistence.xmlファイルはエンティティBeanで使用するデータベースの種類とEntityManagerのデフォルトの振る舞いを規定します。こうして、そのJARを直接にサーバのデプロイディレクトリにデプロイすることができますし、あるいはEARファイルにバンドルされたものでも可能です。

persistence.xmlファイル

persistence.xmlファイルは一つ以上のpersistence-unit要素を含みます。各persistence-unitは永続コンテキスト名、データソース設定、そしてベンダー固有のプロパティを定義します。以下は、典型的なpersistence.xmlファイルです。


<persistence>
  <persistence-unit name="ejb3trail">
    <jta-data-source>java:/DefaultDS</jta-data-source>
    <properties>
      <property name="hibernate.hbm2ddl.auto"
                value="create-drop"/>
    </properties>
  </persistence-unit>
</persistence>

それは、ejb3trailと名づけられたEntityManager(次のセクションを参照)が管理するエンティティBeanを永続化するのにjava:/DefaultDSデータソース(つまり、JBoss AS内の組み込みHSQLデータベース)を使う、と指定しています。この永続コンテキストで複数のエンティティBeanをマップするために異なるデータベースを使う必要があるなら、データソースのJNDI名を変更して、java:/DefaultDSの値を置き換えることができます(その場合、*-ds.xmlファイルで別のデータソース名を定義する必要があります。詳細はアプリケーションサーバガイドを参照のこと)。さらに、JBoss ASはアプリケーションがデプロイされるとき、それらのエンティティBeanのためのデータベーステーブルを生成するべきですし、アプリケーションがアンデプロイされるときにはこれらのテーブルを削除するべきです。アプリケーションはサーバ起動・停止時に自動的にデプロイやアンデプロイされることに注意してください。

persistence.xml内のpropertiesは、アプリケーションサーバ固有です。JBoss ASではそれらはHibernateプロパティです。なぜなら、HibernateがJBoss EJB 3.0のための下位に存在する実装フレームワークだからです。それらの利用可能なプロパティのリストとデフォルトプロパティは、[server_installation]/server/deploy/ejb3.deployer/META-INF/persistence.properties ファイルをご覧ください。

特定のコンテキストからのEntityManagerの注入

今まで見てきたように、JARファイル内のpersistence.xmlファイルは異なる名前を持つ複数の永続コンテキストを定義することができます。名前の付いた永続コンテキストからEntityManagerを取得するには、@PersistenceContextアノテーションのunitName属性に名前を指定する必要があります。次の例はejb3trail永続コンテキストをEntityManagerへ注入します。


@PersistenceContext(unitName="ejb3trail")
EntityManager em;

次の条件を満たせば、unitName属性を省略することが可能です:

  • アプリケーション全体でpersistence.xmlファイルを一つだけ持つ。
  • アプリケーションでスコープ付きクラスローダを使用中である。

二番目の項目はおそらくもっと説明が必要でしょう。EARファイルにデプロイされたWebアプリケーションでは、それはEARファイルのMETA-INFディレクトリでjboss-app.xmlファイルが必要であるということを意味します。そのファイルはクラスローダ用の任意の名前を指定することが可能です。これはその例です:


<jboss-app>
  <loader-repository>
    trailblazer:app=ejb3
  </loader-repository>
</jboss-app>

もしアプリケーションがスコープ付きクラスローダを持たなければ、アプリケーションで定義されたすべての永続コンテキストはサーバ全体で利用可能で、@PersistenceContext注入は同様にグローバルコンテキストからEntityManagerを探します。それはアプリケーション自身の外部で定義された永続コンテキストの使用を可能にします。しかし、一方で、unitName属性を介して永続コンテキスト名を明示的に指定しなければなりません。

まとめ

このトレイルでは、アプリケーションのために複数の永続コンテキストを設定する方法について議論しました。