StaleObjectStateException после обновления объекта - PullRequest
3 голосов
/ 20 января 2012

Когда я пытаюсь зафиксировать мой сеанс, и другой пользователь также изменил этот же объект, Hibernate выбрасывает StaleObjectStateException.

Когда я пытаюсь восстановиться после этого исключения, я звоню:

session.refresh(<staleObject>)

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

Кто-нибудь знает, что может быть не так? У кого-нибудь есть идеи о том, как изящно обработать исключение, не закрывая и не открывая новый сеанс?

примечание: мы используем реализацию Single Session per View для нашего настольного (RCP) приложения

1 Ответ

1 голос
/ 23 января 2012

Как вы упомянули, это длительный сеанс в соответствии с hibernate doc для refresh() метода,

Перечитать состояние данного экземпляра из базовой базы данных. нецелесообразно использовать это для реализации длительных сеансов , которые охватывают многие бизнес-задачи. Этот метод, однако, полезен в определенных особые обстоятельства. Например где триггер базы данных изменяет состояние объекта при вставке или обновлении после выполнения прямого SQL (например, массовое обновление) в том же сеансе после вставки BLOB-объекта или Clob-файла

Я бы предложил вам изменить стратегию использования одного сеанса на протяжении жизненного цикла приложения и использовать сеанс, но транзакция означает открытый сеанс только тогда, когда вам нужно взаимодействовать с базой данных и после этого закройте сеанс.

Я не подозреваю о каких-либо принуждениях к использованию длительной сессии, это всего лишь предложение.

...