将对象重新附加到会话时使用NHibernate NonUniqueObjectException(使用Lock)

时间:2009-08-14 20:08:15

标签: nhibernate session object-persistence

执行的基本顺序:

  1. 查询PersistentObjects的集合,然后与会话分开缓存。
  2. 将集合传递给需要将它们重新附加到会话的模块,以便懒惰地加载某些属性(使用session.Lock(obj, LockMode.None))。
  3. 模块完成处理后,另一个模块会尝试SaveOrUpdate UserSettingsession.Flush()对象,其中包含初始化操作的用户的一些使用情况统计信息。
  4. NonUniqueObjectException NHibernate会抛出obj = session.Get(obj.GetType(), (obj as PersistentObject).Id);
  5. 我发现解决此问题的一种方法是使用以下命令获取对象的新副本:

    session.Lock

    而不是使用PersistentObject重新附加。但是,这不是最佳的,因为一些记录集可能非常大,并且单独重新获取每个对象可能会成为性能拖累。

    非唯一的对象是仅在UserSetting类而不是{{1}}类上存在的引用对象。所以我无法理解为什么刷新会导致这种异常。

    我已经尝试在模块完成之后驱逐缓存的对象,但这没有帮助。

    是否有人知道将对象附加到会话中以避免此问题的更好方法?

1 个答案:

答案 0 :(得分:3)

您是否可以使用新会话(或交易)处理每个项目并更新UserSetting?这可能会阻止NonUniqueException。

干杯,

-Maarten