Я пытаюсь сделать полный 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доступ к сеансу
, какой наименее исчерпывающий метод выполнения операции такого типа.
примечание: мне нужно, чтобы это произошло в одной транзакции в случаечто-то не работает, я не хочу, чтобы загрузка данных имела какой-либо эффект.
спасибо.