1

実行の基本的な順序:

  1. のコレクションPersistentObjectsが照会され、セッションとは別にキャッシュされます。
  2. コレクションはモジュールに渡されます。モジュールは、プロパティの一部を遅延ロードするために、それらをセッションに再接続する必要があります(を使用してsession.Lock(obj, LockMode.None))。
  3. モジュールが処理を完了した後、別のモジュールが、アクションを初期化したユーザーの使用統計をSaveOrUpdate含むオブジェクトを試行します。UserSetting
  4. NHibernateで。session.Flush()をスローしNonUniqueObjectExceptionます。

この問題を回避する1つの方法は、次のオブジェクトの新しいコピーを取得することです。

obj = session.Get(obj.GetType(), (obj as PersistentObject).Id);

で再接続する代わりにsession.Lock。ただし、一部のレコードセットは潜在的に非常に大きいため、これは最適ではなく、各オブジェクトを個別に再取得するとパフォーマンスが低下する可能性があります。

一意でないオブジェクトは、クラスにのみ存在し、PersistentObjectクラスには存在しない参照オブジェクトですUserSetting。したがって、フラッシュによってこの例外が発生する理由がわかりません。

モジュールが終了した後、キャッシュされたオブジェクトを削除しようとしましたが、これは役に立ちません。

この問題を回避できるオブジェクトをセッションにアタッチするためのより良い方法を知っている人はいますか?

4

1 に答える 1

3

各アイテムの処理とUserSettingの更新に新しいセッション(またはトランザクション)を使用できますか?これにより、NonUniqueExceptionが防止される可能性があります。

乾杯、

-マールテン

于 2009-08-14T20:24:45.857 に答える