проблемы с обновлением отдельной коллекции - PullRequest
0 голосов
/ 21 января 2011

Я пытаюсь сделать полный CRUD, используя коллекцию отдельных объектов (т.е. они были созданы без использования спящего режима и не связаны с сеансом).

идентификаторы элементов определяются пользователем (не генерируется).

коллекция содержит записи, которые уже существуют в базе данных, и записи, которых нет в базе данных.

существующие записи должны быть обновлены, новые записи должны быть вставлены.

любые записи, которые существуют в базе данных, но отсутствуют в коллекции, должны быть удалены.

до сих пор я пытался сначала удалить все записи из базы данных, а затем выполнить saveOrUpdate для каждого элемента вколлекция:

for (Object entity : session.createCriteria(type).list())
    session.delete(entity);

for (Object entity : collection)
    session.saveOrUpdate(entity);

однако это приводит к ошибке

другой объект с таким же значением идентификатора уже был связан с сеансом

я предположил, что это потому, что цикл удаления загружал объект в сеанс, и затем я пытался сохранить другой объект сЭтот же идентификатор был позже, поэтому я изменил код, чтобы исключить каждую удаляемую сущность:

for (Object entity : session.createCriteria(type).list())
{
    session.delete(entity);
    session.evict(entity);
}

for (Object entity : collection)
    session.saveOrUpdate(entity);

и теперь я получаю

org.hibernate.AssertionFailure: возможный nonthreadsafeдоступ к сеансу

, какой наименее исчерпывающий метод выполнения операции такого типа.

примечание: мне нужно, чтобы это произошло в одной транзакции в случаечто-то не работает, я не хочу, чтобы загрузка данных имела какой-либо эффект.

спасибо.

1 Ответ

2 голосов
/ 21 января 2011

IMO не следует удалять все объекты перед их повторным сохранением. Вместо этого я бы

  • найти все сущности,
  • сравнить новую коллекцию с найденной и определить, какие объекты должны быть удалены
  • удалить эти объекты
  • объединить остальные (используя метод слияния, который скопирует состояние ваших отсоединенных сущностей во вложенные, даже если они уже находятся в сеансе)

Обратите внимание, что первый и второй шаги могут быть выполнены путем нахождения всех сущностей, за исключением тех, чей ID находится в вашей коллекции отдельных сущностей: «выберите e из сущности e, где e.id нет в (: idsOfDetachedEntities)»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...