Hibernate JTATransaction - JTAトランザクション

2008/11/11 15:43Update
TAGS: JTATransaction | JTA | トランザクション | Hibernate

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回:後編

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments