Базовый порядок исполнения:NHibernate NonUniqueObjectException когда реплантации объекты сессии (с замком)
- Коллекция
PersistentObjects
опрашивается затем кэшируется отдельно от сессии. - Сбор передается модулю, который должен повторно подключить их к сеансу, чтобы лениво загрузить некоторые свойства (используя
session.Lock(obj, LockMode.None)
). - После того, как модуль завершил обработку, другой модуль пытается создать объект
SaveOrUpdate
aUserSetting
с некоторой статистикой использования для пользователя, который инициализировал действие. session.Flush()
NHibernate выбрасываетNonUniqueObjectException
.
Я обнаружил, что один из способов работы вокруг этого вопроса, чтобы получить новые копии объектов с:
obj = session.Get(obj.GetType(), (obj as PersistentObject).Id);
вместо реплантации с session.Lock
. Однако это неоптимально, так как некоторые из наборов записей потенциально достаточно велики, и переустановка каждого объекта индивидуально может стать перетаскиванием производительности.
Объект, который не является уникальным, является ссылочным объектом, который существует только в классе PersistentObject
, а не в классе UserSetting
. Поэтому я не могу понять, почему флеш вызовет это исключение.
Я попытался вырезать кешированные объекты после того, как модуль с ними сделан, но это не поможет.
Кто-нибудь знает, как лучше присоединить объекты к сеансу, которые могли бы избежать этой проблемы?
Doh! Это очевидное решение, и я должен был подумать. Теперь я чувствую себя глупо. ;) – Joel