2012-03-31 8 views
5

私は休止状態では初心者です。私はトランザクションとフラッシングに関する疑問を持っています。休止中のトランザクションとフラッシュについて

私たちはオブジェクトを永続化したいときはいつでも、セッションを開いてトランザクションを開始します。これらのうちの1つが最初に来て、もう1つが続きます......

1)session.getTransaction.commit(); 2)session.flush()

私が読んだことによると、commit()は値をデータベースにコミットします。 flush()はオブジェクトの状態をデータベースに同期します。

これらの2つの違いは何ですか?

答えて

8

session.flush()は、休止状態セッションによって管理されているすべての永続オブジェクトに対してダーティチェックを実行しているフラッシュ処理を行います。オブジェクトがダーティであると考えられる場合(つまり、その休止セッションに格納されたオブジェクトの値がデータベース内の対応するレコード)、hibernateは、これらの相違を同期させて、hibernateセッションに格納されたオブジェクトを対応するデータベースレコードと同じ値にするために、直ちにUPDATE SQLをDBに発行します。

しかし、UPDATE SQLを発行しても、変更されたデータが実際にDBに保存されているわけではなく、変更されたデータを実際にDBに保存することを確認するためにトランザクションをCOMMITする必要があります。 UPDATE SQLを発行した後でトランザクションをコミットする前にエラーが見つかった場合、UPDATE SQLによる変更をROLLBACKします。

休止状態セッションのフラッシュ動作は、session.setFlushMode()で設定できるFlushModeパラメータで決まります。既定値はFlushMode.AUTOで、session.flush()がトランザクションをコミットしてクエリを実行する前に自動的に発生します。

session.getTransaction.commit()がデフォルトのFlushModeで呼び出された場合、session.getTransaction.commit()の実行前に暗黙的にsession.flush()が実行されます。

関連する問題