【发布时间】:2009-08-14 20:08:14
【问题描述】:
基本执行顺序:
- 查询
PersistentObjects的集合,然后与会话分开缓存。 - 集合被传递给一个模块,该模块需要将它们重新附加到会话中,以便延迟加载某些属性(使用
session.Lock(obj, LockMode.None))。 - 模块完成处理后,另一个模块尝试
SaveOrUpdateUserSetting对象,其中包含初始化操作的用户的一些使用统计信息。 - 在
session.Flush()NHibernate 上抛出一个NonUniqueObjectException。
我发现解决此问题的一种方法是获取对象的新副本:
obj = session.Get(obj.GetType(), (obj as PersistentObject).Id);
而不是使用session.Lock 重新附加。但是,这并不是最佳选择,因为某些记录集可能非常大,并且单独重新获取每个对象可能会拖累性能。
非唯一对象是仅存在于PersistentObject 类上的引用对象,而不是UserSetting 类。所以我不明白为什么刷新会导致这个异常。
我尝试在模块处理完缓存对象后逐出缓存对象,但这无济于事。
有谁知道将对象附加到会话的更好方法可以避免这个问题?
【问题讨论】:
标签: nhibernate session object-persistence