Оба должны сохранить, поэтому первый пример выглядит как ошибка.Запросы Grails выполняются в контексте перехватчика OpenSessionInView.Это открывает сеанс Hibernate в начале каждого запроса и привязывает его к потоку, а также сбрасывает и закрывает его в конце запроса.Это очень помогает при отложенной загрузке, но может иметь неожиданные последствия, как вы видите.
Хотя вы не сохраняете явным образом, логика сброса Hibernate включает в себя поиск всех прикрепленных экземпляров, которые были изменены, и отправкуобновления базы данных.Это оптимизация производительности, поскольку, если бы каждое изменение было перенесено, это замедляло бы работу.Так что все, что может подождать, пока очистка не будет поставлена в очередь.
Таким образом, единственное время, которое вам нужно явно сохранить, - это для новых экземпляров и когда вы хотите проверить ошибки проверки.