2012-01-12 2 views
5

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

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

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

ответ

1

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

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

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

+0

В некоторых случаях мы действительно создаем 'merge ui'. Но есть некоторые варианты использования, в которых данные несущественны, чтобы просто перезаписываться, мне было интересно, есть ли какой-то метод по умолчанию для этого или вам просто нужно написать алгоритм самостоятельно. –

+0

Не то чтобы я знаю, что боюсь. –

+1

Это хороший вопрос. Я потратил немало времени на размышления о том, как лучше всего справиться с этой ситуацией! –

0

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

Смежные вопросы