3.8. J2EE アプリケーションサーバーとの統合

Hibernate は J2EE 構造と統合するポイントをサポートしています:
  • コンテナ管理データソース: Hibernate は JNDI が提供し、 コンテナが管理する JDBC 接続を使用できます。通常、 JTA 対応の TransactionManagerResourceManager がトランザクション管理 (CMT) がトランザクション管理を行い、 特に複数のデータソースにまたがる分散トランザクションを処理します。 プログラムを用いてトランザクション境界を指定することもできます (BMT)。 また、 コードの移植性を維持するためオプションの Hibernate Transaction API を使用することもできます。
  • 自動 JNDI バインディング: Hibernate は JNDI が立ち上がった後に SessionFactory を生成します。
  • JTA セッションバインディング: Hibernate Session は自動的に JTA トランザクションのスコープにバインドされることが可能です。 SessionFactory を JNDI からルックアップして、 現在の Session を取得します。 JTA トランザクションが完了した際、 Hibernate が Session をフラッシュし、 閉じます。 トランザクション境界は、 宣言的 (CMT) かプログラムの使用 (BMT/UserTransaction) になります。
  • JMX デプロイメント: JMX が使用可能なアプリケーションサーバー (JBoss AS など)の場合、 Hibernate を MBean としてデプロイすることが可能です。 これにより Configuration から SessionFactory をビルドする 1 行の起動コードが不要となります。 コンテナが HibernateService を起動し、 サービスの依存関係 (Hibernate 起動前にデータソースが使用可能でなければならないなど) に対応します。
環境に依存しますが、アプリケーションサーバーが "connection containment" の例外を出す場合、設定のオプション hibernate.connection.aggressive_release を true にしてください。

3.8.1. トランザクション戦略設定

Hibernate Session API は、 アーキテクチャ内のトランザクション境界システムに依存しません。 Hibernate が接続プールより直接 JDBC を使用するようにすると、 JDBC API を呼び出してトランザクションを開始および終了することができます。 J2EE アプリケーションサーバーで動作させる場合、 Bean 管理のトランザクションを使用し、 必要に応じて JTA API と UserTransaction を呼び出すことになるでしょう。
これら 2 つ (およびそれ以外) の環境でコードの移植性を維持するには、 基盤となるシステムをラッピングして隠すオプションの Hibernate Transaction API を推奨します。 Hibernate 設定プロパティの hibernate.transaction.factory_class を設定して Transaction インスタンスのファクトリクラスを指定する必要があります。
3 つの標準 (またはビルトイン) を選択できます。
org.hibernate.transaction.JDBCTransactionFactory
データベース (JDBC) トランザクションに委譲します(デフォルト)
org.hibernate.transaction.JTATransactionFactory
このコンテキスト (EJB セッション Bean メソッドなど) で既存のトランザクションが進行中である場合にコンテナ管理トランザクションへ委譲します。 そうでない場合は、 新しいトランザクションが開始され、 Bean 管理トランザクションが使用されます。
org.hibernate.transaction.CMTTransactionFactory
コンテナ管理 JTA トランザクションに委譲します
独自のトランザクション戦略 (CORBA トランザクションサービス向けなど) を定義することもできます。
Hibernate の機能の一部 (2 次キャッシュ、 JTA によるコンテキストセッションなど) は、 管理された環境の JTA TransactionManager へアクセスする必要があります。 アプリケーションサーバーでは、 J2EE は 1 つのメカニズムに標準化しないため、 Hibernate がTransactionManager への参照を取得する方法を指定する必要があります。

表3.10 JTA TransactionManager

Transaction Factory Application Server
org.hibernate.transaction. JBossTransactionManagerLookup JBoss
org.hibernate.transaction. WeblogicTransactionManagerLookup Weblogic
org.hibernate.transaction. WebSphereTransactionManagerLookup WebSphere
org.hibernate.transaction. WebSphereExtendedJTATransactionLookup WebSphere 6
org.hibernate.transaction. OrionTransactionManagerLookup Orion
org.hibernate.transaction. ResinTransactionManagerLookup Resin
org.hibernate.transaction. JOTMTransactionManagerLookup JOTM
org.hibernate.transaction. JOnASTransactionManagerLookup JOnAS
org.hibernate.transaction. JRun4TransactionManagerLookup JRun4
org.hibernate.transaction. BESTransactionManagerLookup Borland ES