Hibernate JTATransaction - JTAトランザクション
2008/11/11 15:43Update
Hibernateは、JDBCによるトランザクション、及びJTAトランザクション2種類のトランザクションをサポートしています。本文はJTAトランザクションについて学びます。
Hibernateがサポートするトランザクション
Hibernate自身は、トランザクション処理機能を備えていません。Hibernate Transactionと言えば、単なる低レベルのJDBCトランザクションやJTAトランザクションのカプセル化だけです。
Hibernateは次の2つのトランザクションをサポートしています。
◇ JDBCによるトランザクション:セッションスコープトランザクション
◇ JTAトランザクション:セッションスコープより大きいトランザクション
Hibernateでは、トランザクション管理用抽象化APIを提供しており、JDBC、JTAのどちらを利用した場合でも同一コードでトランザクションを管理することが可能です。
#hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
#hibernate.transaction.factory_class=org.hibernate.transaction.JDBCTransactionFactory
JTAトランザクション
JDBCトランザクションのライフサイクルは、セッション内に限られたものの、セッションスコープになります。
複数のセッションを1 つのトランザクションに参加させる必要がある場合、JTAトランザクションを使います。
hibernate.cfg.xml設定(抜粋)<!-- DataSource properties:アプリケーションサーバ でのデータソースのJNDI名を指定します --> <property name="hibernate.connection.datasource">java:comp/env/MyDataSource</property> <!-- JBoss transaction manager lookup :JTA トランザクションマネージャ。アプリケーションサーバのJTA実装を取得するためのクラスを指定します --> <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property> <!-- JTA transaction properties:JTATransactionファクトリクラス --> <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property> <property name="jta.UserTransaction">java:comp/UserTransaction</property>
※hibernate.connection.datasourceプロパティには、データソースのJNDI名を指定します。
※hibernate.transaction.manager_lookup_classプロパティには、TransactionManagerLookup のクラス名を指定します。
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
※hibernate.transaction.factory_classプロパティには、JTATransactionファクトリクラス名を指定します。
※jta.UserTransactionプロパティには、アプリケーションサーバからJTA UserTransaction を取得するために JTATransactionFactory に使われるJNDI名 を設定します。
JTAは通常,アプリケーションサーバがその実装を提供します。詳細について、それぞれのマニュアルを参照してください。
※JBoss、Weblogic、WebSphere、Orion、Resin、JOTM、JOnAS、JRun4、Borland ESなど
// BMT(アプリケーション自身でトランザクションを管理(開始、コミット)する場合)
UserTransaction tx = (UserTransaction)new InitialContext()
.lookup("java:comp/UserTransaction"); //JNDIからUserTransactionを取得
try {
//トランザクション開始
tx.begin();
//セッションの取得
session1 = sessionFactory.openSession();
// データの永続化(更新、挿入、削除など)
session1.save(user);
//セッションの取得
session2 = sessionFactory.openSession();
// データの永続化(更新、挿入、削除など)
session2.update(address);
//トランザクションコミット
tx.commit();
}
catch (RuntimeException e) {
//トランザクションロールバック
tx.rollback();
throw e;
}
また、トランザクションはCMTである、もしくはコンテナーに任せる場合、トランザクションを明示的に開始・コミットする必要がありません。
session1.save(user); ... session2.update(address);
参考資料
Java Transaction API - Wikipedia
TomcatのJNDI機能との連係(Hibernate3) 
JTAを使ったトランザクション管理第1回:前編
JTAを使ったトランザクション管理第2回:後編
Sponsored Link
- Relative Articles
- Hibernate JDBCTransaction - JDBCによるトランザクション - (2008/07/14 18:26)