Grails регистрирует перехватчик OpenSessionInView, который открывает сеанс Hibernate в начале каждого запроса, а также сбрасывает и закрывает его после его завершения.Это в первую очередь для коллекций с отложенной загрузкой.Если бы не было открытого сеанса, после загрузки экземпляра он немедленно отключился бы, поэтому попытка доступа к коллекции вызвала бы исключение.Если сеанс остается активным, коллекции можно разрешать.
По умолчанию Hibernate автоматически отправляет изменения в постоянных экземплярах во время сброса, поэтому, поскольку перехватчик OSIV сбрасывает в конце запроса, любые «грязные» экземпляры, напримерваш экземпляр пользователя будет отправлять свои изменения в базу данных.
Чтобы обойти это, вы можете использовать метод read()
для загрузки существующего экземпляра, если вы хотите только временно изменить его, например, для рендеринга вGSP, но не хочу, чтобы изменения автоматически сохранялись.
Это не сработает в вашем случае, поскольку вы не получаете старый экземпляр, вы его создаете.В вашем случае просто позвоните a.discard()
после сохранения, и это отключит его от сеанса Hibernate, и Hibernate не будет ничего нажимать, когда происходит сброс.