HibernateOptimisticLockingFailureException при обновлении объекта - PullRequest
3 голосов
/ 26 сентября 2011

Я получаю следующее исключение при обновлении объекта.

HibernateOptimisticLockingFailureException: объект класса [User] с идентификатором [25614]: оптимистическая блокировка не удалась;вложенное исключение: org.hibernate.StaleObjectStateException: строка была обновлена ​​или удалена другой транзакцией (или сопоставление несохраненного значения было неправильным): [Пользователь # 25614]

Ситуация: - Причина, по которой я сталкиваюсь с этимошибка в том, что у меня есть форма, где отображаются пользователи, и у меня есть две кнопки: одна для обновления пароля, а другая для редактирования сведений о пользователях.когда я нажимаю на обновление пароля, он просто запрашивает объект, обновляет свой пароль и сохраняет объект в спящем сеансе.Затем я нажимаю кнопку «Изменить» и изменяю информацию, а затем сохраняю ее, после чего появляется указанное выше исключение, поскольку объект, который я пытаюсь сохранить, не является объектом сеанса гибернации, но объект с таким же идентификатором запрашивался в режиме гибернации при обновлениипароль.Теперь у меня есть два объекта с одним и тем же идентификатором, один находится в сеансе гибернации, а другой еще не сохранен (не отключен).Я хочу обновить, сохранить изменения из не сохраненного объекта в базе данных, но поскольку в сеансе спящего режима находится объект с таким же идентификатором, поэтому hibernate выдает исключение.

Как объединить изменения из непостоянных объектов в постоянныеодин

1 Ответ

6 голосов
/ 26 сентября 2011

Ответ в вопросе: при смене пароля в первой транзакции поле версии объекта пользователя обновляется, но вы сохраняете устаревшую версию вашего объекта пользователя в сеансе HTTP и пытаетесь обновить пользователя с помощью эта устаревшая версия во второй транзакции.

Просто обновляйте пользовательский объект, который вы храните в сеансе HTTP, каждый раз, когда меняется пароль.

Вы также можете вручную скопировать каждое свойство измененного пользователя в присоединенный пользовательский объект, но тогда вам больше не понадобится оптимистическая блокировка.

// first transaction:
User refreshedUser = userService.updateUserPassword(userId, newPassword);
request.getSession().setAttribute("user", refreshedUser);

// ...
// second transaction:
User modifiedUser = (User) request.getSession().getAttribute("user");
modifiedUser = userService.updateUser(modifiedUser);
request.getSession().setAttribute("user", modifiedUser);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...