2011-11-09 15 views
0

データ永続性のためにnHibernateを使用するMVCアプリケーションがありますが、セッションからオブジェクトを削除していても何らかの理由でデータベースに保持されています。オブジェクトがnhibernateセッションから切り離されていません

私は、ユーザーに変更を適用させ、親オブジェクトのプロパティの新しい値に基づいて子コレクションを再計算させる複雑なオブジェクトを持っています。しかし、結果の変更をビューに戻してプレビューとしてのみレンダリングするため、これらの変更は永続化したくありません。ユーザーはコミットできますが、別のアクションを使用します。

このプロセスでオブジェクトのnHibernateを照会した直後に、セッションから退去しますが、何らかの理由でそれがまだ保持されています。

nHibernate Profilerによると、これはコントローラのアクションを飾るフィルタにトランザクションコミットがあるためです。これは、トランザクションがコミットされていない限り、変更が加えられていない場合でも、データベースから読み取られたアイテムが第2レベルのキャッシュにキャッシュされていないことを読み取ったベストプラクティスのために行われました。それでも、コミットによって追い出されたオブジェクトがデータベースに変更を持続させる原因は説明されません。私はこの行動を説明する何かが不足していると仮定していますが、私は何が分からないのですか?

答えて

0

私はオブジェクトを照会しているのですが、それをセッションから退去させて、ユーザーのプレビューを変更してもよろしいですか?

子コレクションも変更していますか?なぜなら、私が覚えている限り、NHからオブジェクトを取り除くと、それは自動的に関連する子オブジェクトを(少なくともNH v2.xでは)追い出していないからです。

したがって、子オブジェクトを変更すると(明示的に削除していない)、それを永続化しようとします。カスケード規則によっては親オブジェクトも永続化しようとします。

+0

私は実際にすべてのエビクトについて不思議に思っています。 Evict()は、より多くの参照を検索するほど、最初のレベルのキャッシュから項目を削除するだけです。しかし、それがセッションから切り離されていることはほとんど言及していません。私は、スイッチを反転させ、永続的ではなく一時的にメモリ内のオブジェクトを一時的にすることができるようにしたいと考えています。 –

+0

私はEvict()を使っていません。実際に私はそれを使用しようとしましたが、言及した理由であきらめます。 エンティティを保存したくないとき(たとえば、保存の検証が失敗する前など)は、ロールバックするだけです。 – Siim

関連する問題