0

セッション内の休止状態のBeanセッターの動作について混乱しています。セッションでBeanフィールドを設定すると、HibernateはBeanがダーティであることを認識し、セッションを閉じると、これは保留中の更新であり、データベースにフラッシュされると思いました。

ただし、1つの休止状態セッション内でテストを実行し、そのIDでBeanをフェッチし、フィールドをtrueからfalseに変更してから、このフィールドがfalseであるすべてのBeanのリストに対してHQLクエリを実行しました。「ダーティ」なBeanは、セッターを呼び出したときにhibernateがすでにデータベースを更新したかのように結果セットに表示されました。次に、セッションを終了する前にsession.clear()を実行して、保留中の更新をキャンセルし、すべてのBeanを削除しました。これにより、セッター呼び出しのダーティな変更が効果的に破棄されると思いました。それでもデータベースをチェックしたところ、trueからfalseへの変更が記録されました。注:このセッション内でsession.flush()を呼び出すことはありません。

Beanセッターを呼び出すとすぐに、HibernateがデータベースUPDATE呼び出しを発行している必要があるようです。しかし、これは正しくないようですか?

アンディ

4

2 に答える 2

1

そうです、Hibernateはクエリを実行する前に保留中の変更をフラッシュします(保留中の変更がクエリ結果に影響を与える可能性があると判断した場合)。DBに変更を保存したくない場合は、トランザクションをロールバックする必要があります。トランザクションを呼び出しclear()てコミットすると、clear()呼び出されるのが遅すぎるため(SQL UPDATE後)、DBに保持されます。または、kamleshの提案に従ってフラッシュモードを変更しますが、特定のフラッシュモードを選択するときは、何をしているかを確認してください。

PS:冬眠の世界へようこそ。より多くのそのような驚きを期待してください。

于 2012-10-22T15:20:07.643 に答える
0

hibernateのセッションFlushModeを確認するだけです。AlwaysモードまたはAutoモードの場合、hibernateは、新しいクエリを実行する前に、ダーティデータをデータベースにフラッシュします。

FlushModeのJavadoc

于 2012-10-22T15:10:46.913 に答える