2009-08-14 70 views
1

執行的基本順序:NHibernate的NonUniqueObjectException重新附加對象時,該會話(鎖定)

  1. PersistentObjects集合被詢問然後分別從會話高速緩存。
  2. 將集合傳遞給需要將它們重新附加到會話以便延遲加載某些屬性的模塊(使用session.Lock(obj, LockMode.None))。
  3. 模塊完成處理後,另一個模塊會嘗試使SaveOrUpdateUserSetting對象具有初始化操作的用戶的一些使用情況統計信息。
  4. session.Flush() NHibernate拋出NonUniqueObjectException

我發現,解決此問題的工作的一種方式是讓對象的新副本:

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

,而不是與session.Lock重新連接。然而,這是非最優的,因爲一些記錄集可能相當大,並且單獨重新獲取每個對象可能成爲性能拖累。

非唯一對象是僅存在於PersistentObject類中的引用對象,而不是UserSetting類。所以我不明白爲什麼刷新會導致這種異常。

我試過在模塊完成後逐出緩存的對象,但這沒有幫助。

有誰知道更好的方法將對象附加到會話,可以避免此問題?

回答

3

您是否可以使用新的會話(或事務)來處理每個項目和更新UserSetting?這可能會阻止NonUniqueException。

乾杯,

-Maarten

+0

衛生署!這是顯而易見的解決方案,也是我應該想到的。現在我感到很傻。 ;) – Joel 2009-08-14 20:42:50