【问题标题】:NHibernate NonUniqueObjectException when reattaching objects to the session (with Lock)将对象重新附加到会话时出现 NHibernate NonUniqueObjectException(带锁)
【发布时间】:2009-08-14 20:08:14
【问题描述】:

基本执行顺序:

  1. 查询PersistentObjects 的集合,然后与会话分开缓存。
  2. 集合被传递给一个模块,该模块需要将它们重新附加到会话中,以便延迟加载某些属性(使用 session.Lock(obj, LockMode.None))。
  3. 模块完成处理后,另一个模块尝试SaveOrUpdate UserSetting 对象,其中包含初始化操作的用户的一些使用统计信息。
  4. session.Flush() NHibernate 上抛出一个NonUniqueObjectException

我发现解决此问题的一种方法是获取对象的新副本:

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

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

非唯一对象是仅存在于PersistentObject 类上的引用对象,而不是UserSetting 类。所以我不明白为什么刷新会导致这个异常。

我尝试在模块处理完缓存对象后逐出缓存对象,但这无济于事。

有谁知道将对象附加到会话的更好方法可以避免这个问题?

【问题讨论】:

    标签: nhibernate session object-persistence


    【解决方案1】:

    您能否使用新的会话(或事务)来处理每个项目并更新 UserSetting?这可能会阻止 NonUniqueException。

    干杯,

    -马丁

    【讨论】:

    • 噢!这是显而易见的解决方案,也是我应该想到的。现在我觉得很傻。 ;)
    猜你喜欢
    • 2018-01-08
    • 2012-03-31
    • 2011-02-13
    • 2011-07-26
    • 2011-04-11
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多