Hitachi

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


付録C.2 デプロイメントに関する規約

デプロイメントに関する規約には,コンテナ側の責任とJPAプロバイダ側の責任があります。

〈この項の構成〉

(1) コンテナ側の責任

デプロイメント時に,コンテナはアプリケーション内の決められた場所にパッケージングされたpersistence.xmlを検索します。アプリケーション内にpersistence.xmlが存在する場合には,コンテナはpersistence.xmlに定義された永続化ユニットの定義を処理します。なお,コンテナが検索する場所については,「5.8 persistence.xmlでの定義」を参照してください。

コンテナはpersistence.xmlファイルを指定されたバージョンのpersistence.xmlスキーマで検証します。検証の結果,エラーが発生した場合にはユーザに通知します。persistence.xmlにプロバイダやデータソースの情報が指定されていない場合には,デフォルト値が使用されます。使用されるデフォルト値については,「5.8 persistence.xmlでの定義」を参照してください。コンテナが永続化ユニットのエンティティマネージャファクトリを作成するときには,JPAプロバイダにプロパティを渡すことがあります。

コンテナは,persistence.xmlで永続化ユニットごとに定義されたjavax.persistence.spi.PersistenceProviderの実装クラスのインスタンスを作成し,createContainerEntityManagerFactoryメソッドを呼び出して,コンテナ管理のエンティティマネージャを作成するためのEntityManagerFactoryを取得します。永続化ユニットのメタデータは,PersistenceUnitInfoオブジェクトとして,createContainerEntityManagerFactoryメソッドの引数でJPAプロバイダに渡されます。コンテナは一つの永続化ユニット定義に対して,一つだけEntityManagerFactoryを作成し,そのEntityManagerFactoryから複数のEntityManagerを作成します。

永続化ユニットが再デプロイされる場合には,コンテナはすでに取得したEntityManagerFactoryのcloseメソッドを呼び出したあと,createContainerEntityManagerFactoryを新しいPersistenceUnitInfoとともに呼び出します。

コンテナはvalidation-modeでNONE以外が指定された場合,createContainerEntityManagerFactoryに引き渡すMapにValidatorFactoryのインスタンス(javax.persistence.validation.factoryキー)を格納します。

(2) JPAプロバイダ側の責任

JPAプロバイダはPersistenceProvider SPIを実装し,PersistenceProviderのcreateContainerEntityManagerFactoryメソッドが呼ばれたときに,引数で渡される永続化ユニットのメタデータ(PersisetnceUnitInfo)を使用して,EntityManagerFactoryを作成し,コンテナに返す必要があります。

JPAプロバイダは,永続化ユニットに含まれるマネージドクラス(エンティティクラスなど)のメタデータアノテーションを処理します。また,永続化ユニットでO/Rマッピングファイルが使用されている場合には,JPAプロバイダが解釈する必要があります。このとき,O/Rマッピングファイルを,指定されたバージョンのO/Rマッピングスキーマを使用して検証し,エラーが発生した場合はユーザに通知する必要があります。

(3) javax.persistence.spi.PersistenceProviderインタフェース

JPAプロバイダは,javax.persistence.spi.PersistenceProviderインタフェースを実装する必要があります。このインタフェースはコンテナによって呼び出されるものであり,アプリケーションから呼び出すものではありません。PersistenceProviderの実装クラスは,publicで引数のないコンストラクタを持っている必要があります。

インタフェース定義は標準仕様書を参照してください。

(4) javax.persistence.spi.PersistenceUnitInfoインタフェース

インタフェース定義は標準仕様書を参照してください。

参考

アプリケーションサーバでは,永続化ユニットでJTAデータソース,非JTAデータソースが定義されていない場合には,getJtaDataSource()またはgetNonJtaDataSource()はnullを返します。永続化ユニットでJTAデータソース,非JTAデータソースが定義されていない場合とは,次の状態を指します。

  • persistence.xmlで<jta-data-source>,<non-jta-data-source>が省略されていて,かつデフォルト値がシステムプロパティejbserver.jpa.defaultJtaDsName,ejbserver.jpa.defaultNonJtaDsNameで定義されていない場合

  • システムプロパティejbserver.jpa.overrideJtaDsName,ejbserver.jpa.overrideNonJtaDsNameも定義されていない場合