лучшая стратегия обновления в спящем режиме stalestateException - PullRequest
6 голосов
/ 12 января 2012

мы используем спящий режим с оптимистичной блокировкой. Все наши объекты имеют аннотацию @version.

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

Это распространенный вариант использования исключений устаревшего состояния. Мой вопрос связан с этим вариантом использования. Какова лучшая стратегия, если пользователь решает перезаписать текущую строку базы данных своими изменениями? Я просмотрел справочное руководство по гибернации и различные веб-сайты, но все, что упоминается, - это тот факт, что вы должны уловить устаревшее исключение, а затем программно обработать перезапись данных. Мне интересно, есть ли в hibernate какие-либо утилиты, упрощающие эту стратегию, простейшая вещь, с которой я могу столкнуться, если пользователь решит перезаписать свои данные, это извлечь последнюю версию сущности из базы данных, затем скопировать все измененные поля в этот объект и затем сохранение измененного объекта обратно в базу данных. Но я не перестаю удивляться, если нет более элегантного решения.

Ответы [ 2 ]

2 голосов
/ 12 января 2012

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

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

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

0 голосов
/ 29 ноября 2012

По моему опыту, чтобы ввести некоторую автоматизацию в этом случае, я использовал следующий трюк. Я перезагрузил сущность и установил из нее значение последней версии для своего устаревшего объекта, который не удалось сохранить ранее. Затем я merge() передал свой устаревший объект. Таким образом, все поля будут перезаписаны, версия обновлена ​​и готова к сохранению. Конечно, обо всех связанных ссылках нужно заботиться одинаково.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...