Мы используем hibernate через язык сценариев на основе java groovy.
Извлекаем запись, обновляем запись и сохраняем запись.
во время обновления мы очищаем ассоциации и перезагружаем их перед сохранением.
Мы получаем исключение, когда Hibernate сбрасывает запись после удаления связей, но перед установкой новых, что вызывает ошибку проверки.
Т.е. у нас есть ограничение на ассоциации:
class Entity {
...
static constraints = {
association1(minSize:1) //require association to have at least 1 record
}
}
Как лучше всего обновить постоянную запись?
Некоторые потенциальные варианты:
==============================================
[1] создать новую запись и скопировать свойства:
def oldEntity = Entity.findByX(x)
if (oldEntity) {
oldEntity.properties = newEntity.properties
oldEntity.save(flush:true);|
}
else {
newEntity.save(flush:true);
}
Проблема здесь в том, что это кажется хакерским - создание отсоединенной сущности и копирование свойств поверх живой.
==============================================
[2] извлечение записи, обновление, сохранение с отключенной очисткой:
sessionFactory.currentSession.flushMode = org.hibernate.FlushMode.MANUAL</p>
<p>def existingEntity = Entity.findByX(x)
existingEntity.association1.clear()
existingEntity.association2.clear()</p>
<p>existingEntity.association1.add(new Association(...))
existingEntity.association2.add(new Association(...))</p>
<p>sessionFactory.currentSession.flushMode = org.hibernate.FlushMode.AUTO
existingEntity.save(flush:true)
Не уверен насчет этого подхода - не нравится такое вмешательство в управление состоянием Hibernate
==============================================
[3] Установите постоянный режим очистки вручную и используйте save () и save (flush: true) для сохранения записей с каскадом: «all-delete-orphan» для обеспечения управления ассоциациями.
Вопрос здесь заключается в том, что это не по умолчанию и зависит от нас, чтобы управлять сбросом Hibernate.
==============================================
Резюме:
Все эти подходы, кажется, пахнут - кто-нибудь может посоветовать наименее плохой подход - или даже наилучшую практику для этой ситуации?
Спасибо
* * Тысяча сорок-девять Alex