| 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`属性を介して永続コンテキスト名を明示的に指定しなければなりません。
まとめ
| このトレイルでは、アプリケーションのために複数の永続コンテキストを設定する方法について議論しました。