2009-08-14 1 views
1

Базовый порядок исполнения:NHibernate NonUniqueObjectException когда реплантации объекты сессии (с замком)

  1. Коллекция PersistentObjects опрашивается затем кэшируется отдельно от сессии.
  2. Сбор передается модулю, который должен повторно подключить их к сеансу, чтобы лениво загрузить некоторые свойства (используя session.Lock(obj, LockMode.None)).
  3. После того, как модуль завершил обработку, другой модуль пытается создать объект SaveOrUpdate a UserSetting с некоторой статистикой использования для пользователя, который инициализировал действие.
  4. session.Flush() NHibernate выбрасывает NonUniqueObjectException.

Я обнаружил, что один из способов работы вокруг этого вопроса, чтобы получить новые копии объектов с:

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

вместо реплантации с session.Lock. Однако это неоптимально, так как некоторые из наборов записей потенциально достаточно велики, и переустановка каждого объекта индивидуально может стать перетаскиванием производительности.

Объект, который не является уникальным, является ссылочным объектом, который существует только в классе PersistentObject, а не в классе UserSetting. Поэтому я не могу понять, почему флеш вызовет это исключение.

Я попытался вырезать кешированные объекты после того, как модуль с ними сделан, но это не поможет.

Кто-нибудь знает, как лучше присоединить объекты к сеансу, которые могли бы избежать этой проблемы?

ответ

3

Можно ли использовать новый сеанс (или транзакцию) для обработки каждого элемента и для обновления пользовательской настройки? Вероятно, это предотвратит исключение NonUniqueException.

Приветствия,

-Maarten

+0

Doh! Это очевидное решение, и я должен был подумать. Теперь я чувствую себя глупо. ;) – Joel

Смежные вопросы