Я сталкиваюсь с этой ошибкой при попытке установить дату lastLogin
с помощью прослушивателя событий в Config.groovy
:
2011-05-12 00: 30: 16,501 ["ajp-bio-8009" -exec-6] ОШИБКА
events.PatchedDefaultFlushEventListener - не удалось синхронизировать
состояние базы данных с сеансом org.hibernate.StaleObjectStateException:
Строка была обновлена или удалена другой транзакцией (или несохраненным значением)
отображение было неверным): [spl.User # 110]
Мой код:
grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
User.withTransaction {
def user = appCtx.springSecurityService.currentUser
user.lastLogin = new Date()
user.save(flush: true)
}
}
Кажется, я не могу повторить это в моей тестовой среде, но однажды, когда я попробовал его вживую в рабочей среде, я увидел эту ошибку и решил вернуться обратно. Решит ли изменение сохранение для слияния?
РЕДАКТИРОВАТЬ: мне удалось воспроизвести ошибку в моей тестовой среде, выполнив вход в качестве одного и того же пользователя одновременно. Для дальнейшей отладки я добавил несколько операторов print в обработчик событий и начал работать с ним. Оказывается, что когда я подписываю или кто-то подписывается на моем сайте, обработчик событий вызывается несколько раз, следовательно, исключение устаревшего объекта. Почему onInteractiveAuthenticationSuccessEvent вызывается более одного раза при входе в систему?
Спасибо,
Рикардо