2013-07-06 5 views
8

休止docsは、この例を示します。Hibernateは読取り専用トランザクション

session = sessionFactory.openSession(); 
session.beginTransaction(); 
List result = session.createQuery("from Event").list(); 
for (Event event : (List<Event>) result) { 
    System.out.println("Event (" + event.getDate() + ") : " + 
     event.getTitle()); 
} 
session.getTransaction().commit(); 
session.close(); 

なぜそれがイベントリストは単にプリントアウトされたにもかかわらずsession.getTransaction().commit()を行う必要がありますか?

答えて

11

SELECTもトランザクションが必要です。トランザクションなしでSELECTを実行することはできません。 SQL GUIツールを使用してDBからデータを選択するときにトランザクションを明示的に開始および終了する必要がないという事実は、これらのツールがautocommitモードを使用していることです。自動コミット・モードでは、データベースはトランザクションの境界を明示的に宣言する必要がないように、1つのSQL文ごとにトランザクションを自動的に開始およびコミットします。

トランザクションを終了しない(トランザクションをコミットまたはロールバックしない)場合、このトランザクションで使用されるデータベース接続は解放されず、データベースは最終的に使用可能な接続を使い果たします。

hibernateの場合、デフォルトでは非自動コミットモード(プロパティーhibernate.connection.autocommitで指定)が使用されます。したがって、トランザクション境界を宣言し、トランザクションが終了することを確認する必要があります。

しかし、あなただけのクエリデータが休止状態APIを使用している場合、それもあなたが明示的にため以下のトランザクション境界を宣言していない大丈夫です:

  1. データベースは、一般的に、自動的に新しいトランザクションを開始します現在のSQL文は1つを必要とし、トランザクションは明示的に開始されません。 java.sql.Connection#close()が呼び出された場合

  2. Session.close()は、JDBC仕様に基礎となるConnection .Accordingをclose()し、アクティブなトランザクションがあり、このアクティブなトランザクションの結果は、JDBCベンダーの実装に依存します。通常、JDBCドライバはこのトランザクションを自動的にコミットまたはロールバックします。しかし、この場合、必要なデータをすでに取得しているため、トランザクションがコミットするかロールバックするかは関係ありません。

+0

詳細な回答ありがとうございます –

関連する問題