実行の基本的な順序:
- のコレクション
PersistentObjects
が照会され、セッションとは別にキャッシュされます。 - コレクションはモジュールに渡されます。モジュールは、プロパティの一部を遅延ロードするために、それらをセッションに再接続する必要があります(を使用して
session.Lock(obj, LockMode.None)
)。 - モジュールが処理を完了した後、別のモジュールが、アクションを初期化したユーザーの使用統計を
SaveOrUpdate
含むオブジェクトを試行します。UserSetting
- NHibernateで。
session.Flush()
をスローしNonUniqueObjectException
ます。
この問題を回避する1つの方法は、次のオブジェクトの新しいコピーを取得することです。
obj = session.Get(obj.GetType(), (obj as PersistentObject).Id);
で再接続する代わりにsession.Lock
。ただし、一部のレコードセットは潜在的に非常に大きいため、これは最適ではなく、各オブジェクトを個別に再取得するとパフォーマンスが低下する可能性があります。
一意でないオブジェクトは、クラスにのみ存在し、PersistentObject
クラスには存在しない参照オブジェクトですUserSetting
。したがって、フラッシュによってこの例外が発生する理由がわかりません。
モジュールが終了した後、キャッシュされたオブジェクトを削除しようとしましたが、これは役に立ちません。
この問題を回避できるオブジェクトをセッションにアタッチするためのより良い方法を知っている人はいますか?