Исключение NHibernate NonUniqueObjectException при повторном подключении объектов к сеансу (с блокировкой)
-
16-09-2019 - |
Вопрос
Основной порядок исполнения:
- Коллекция из
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
класс.Поэтому я не могу понять, почему сброс может вызвать это исключение.
Я пробовал удалять кэшированные объекты после того, как модуль закончил с ними, но это не помогает.
Кто-нибудь знает о лучшем способе прикрепления объектов к сеансу, который мог бы избежать этой проблемы?
Решение
Можете ли вы использовать новый сеанс (или транзакцию) для обработки каждого элемента и для обновления пользовательских настроек?Это, вероятно, предотвратило бы исключение NonUniqueException .
Ваше здоровье,
-Maarten