2012-05-29 2 views
10

誰かが休止状態のセッションが何であるか教えていただけたらと思っていましたか?私は、基準クエリーが挿入すべきでないときに問題を抱えているようです。私はそれが汚いセッションに関連していると信じていますが、本当に汚いセッションが何であるかを知らないと、私は自分の問題を解決できません。また、どのように汚れたセッションを作成しますか?ありがとう。Hibernateのダーティセッションとは何ですか?

答えて

19

閉じているときに変更を保存します。データベースから読み取られたエンティティをキャッシュし、エンティティの変更や、エンティティの追加と削除を、セッションがフラッシュされるまで(つまり、保留中のすべての変更がデータベースに書き込まれるまで)キャッシュします。

一部の変更がまだフラッシュされていない場合、セッションはダーティとなります。したがって、汚れたセッションを持つことは完全に正常です。セッションは、トランザクションがコミットされる前にフラッシュされます。

+0

私はクエリがフラッシュをトリガしないようにするためには、基準クエリsetFlushModeを手動に設定する必要がありますか、修正? –

+0

@Georgeオブジェクトに加えられた変更を保存したくない場合は、セッション外で変更を試みてください。 – richarbernal

+0

セッション外でデータを保存する方法に関する追加情報が必要です。私はまだ冬眠するのにかなり新しいので、どのように始まってセッションに入っているのかは完全にはわかりません。 –

2

これは、データベースにフラッシュされていない、メモリ内の管理された永続オブジェクトを変更したことを意味します。

基本的に、休止状態の背後にあるアイデアは、メモリ内の永続オブジェクトの状態がの状態であることです。管理オブジェクトに変更を加えた場合、休止状態は次の機会にデータベースに格納されます。永続化するつもりはない管理対象オブジェクトに対して、一時的な変更を加えるべきではありません。

hibernateは、すべての管理対象オブジェクトのメモリ内状態をデータベースにフラッシュします。その結果、クエリはアプリケーションの状態に対して正確です。

+0

実際には、それよりも複雑です。Hibernateは、保留中の変更が実行されたクエリに影響を及ぼす可能性がある場合にのみフラッシュします。 –

+0

オブジェクトを挿入するように指示する前に、クエリが挿入を実行しないようにするには、推奨される方法はありますか?私はsetFetchModeをマニュアルに使用していましたが、これは根本的な修正ではなく、バンドの補助的な修正であるかもしれません。 –

+1

FlushModeは、トランザクションの終了前に挿入や更新をしたくない場合は、SessionFactoryでアプリケーション全体、おそらくCOMMIT、MANUALに変更できます。あなたが管理対象のエンティティに変更を加えていて、あなたがバンダイだけでなくデータベースに書きたくないのであれば、それは修正です。 – Affe

5

Hibernateでの不正なセッションは、オブジェクトをセッション内にロードしてから変更するときです。

セッションを開いて新しいオブジェクトを作成するとき。あなたがexplicitily任意の挿入/更新操作を呼び出していない場合であっても

は、Hibernateは汚いとしてセッションをマークし、セッションがHibernateセッションがキャッシュされ

2

単純な言葉でいうと、私たちが知っているように、ダーティデータはまだコミットされていないデータです。同様に、休止状態のダーティセッションにはまだコミットされていない変更されたデータが含まれています。

関連する問題