Исключение NHibernate NonUniqueObjectException при повторном подключении объектов к сеансу (с блокировкой)

StackOverflow https://stackoverflow.com/questions/1279929

Вопрос

Основной порядок исполнения:

  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 класс.Поэтому я не могу понять, почему сброс может вызвать это исключение.

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

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

Это было полезно?

Решение

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

Ваше здоровье,

-Maarten

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top