3.8. J2EE アプリケーションサーバーとの統合
Hibernate は J2EE 構造と統合するポイントをサポートしています:
- コンテナ管理データソース: Hibernate は JNDI が提供し、 コンテナが管理する JDBC 接続を使用できます。通常、 JTA 対応の
TransactionManager
とResourceManager
がトランザクション管理 (CMT) がトランザクション管理を行い、 特に複数のデータソースにまたがる分散トランザクションを処理します。 プログラムを用いてトランザクション境界を指定することもできます (BMT)。 また、 コードの移植性を維持するためオプションの HibernateTransaction
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 |