Java EE環境でJTAトランザクションサポートを使用することをお勧めします。
しかし、Hibernate SessionがJTAを使用できるように、Tomcat6でJTAを構成するにはどうすればよいですか?
バージョン3.0.1以降、Hibernateは
SessionFactory.getCurrentSession()
メソッドを追加しました。当初、これはJTAトランザクションの使用を想定しており、JTAトランザクションは現在のセッションのスコープとコンテキストの両方を定義していました。多数のスタンドアロンJTATransactionManager実装の成熟度を考えると、すべてではないにしても、ほとんどのアプリケーションは、J2EEコンテナにデプロイされているかどうかに関係なく、JTAトランザクション管理を使用する必要があります。これに基づいて、JTAベースのコンテキストセッションを使用するだけで済みます。
TomcatでJTAサポートが必要な場合は、 Atomikos 、 [〜#〜] jotm [〜#〜] 、 ( Bitronix 、 SimpleJTA 、 JBossTS または GeronimoTM/Jencks 。しかし、正直なところ、複数のリソースにわたるトランザクションを処理しない場合は、JTAなしで生活できます(JTAが本当に必要な場合は、本格的なアプリケーションサーバーを使用してください)。
SessionFactory.getCurrentSession()
を使用したいだけの場合は、hibernate.cfg.xmlに次の2行を追加するだけです。
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>
これにより、スレッドごとに一意のセッションが提供されます。サーブレットリクエストは常に1つのスレッド内で処理されるため(コードが新しいスレッドを生成しない場合)、セッションはリクエスト全体にわたって存続します。
リクエスト後、フィルターを使用してセッションを閉じることを忘れないでください!