Как можно использовать аннотацию @Version с приложением MVC? - PullRequest
0 голосов
/ 02 октября 2018

Я искал способы, чтобы помешать двум пользователям думать, что они успешно модифицировали одни и те же данные одновременно.Например, если два пользователя загружают страницу редактирования, и оба пользователя работают на странице редактирования в течение нескольких минут, если пользователь A отправляет форму для сохранения, а затем пользователь B отправляет форму, данные в форме пользователя B получат выигрыш, поскольку она обновлена.в базе данных последней.Проблема в том, что оба пользователя думают, что их работа была сохранена без каких-либо проблем, когда работа пользователя А. теперь потеряна.

Я надеялся, что смогу использовать аннотацию JPA @ Version .Я бы сделал это, отслеживая версию при загрузке страницы редактирования и отправляя эту версию на сервер при отправке формы.Версия, поступающая из внешнего интерфейса, будет помещена в поле версии на объекте, загруженном для обновления, и затем мы будем полагаться на JPA, чтобы предотвратить сохранение, если версия не совпадает с тем, что находится в БД.В приведенном выше случае пользователь A победит, а пользователь B получит сообщение о том, что его сохранение не удалось, потому что данные были обновлены другим пользователем.

Проблема здесь в том, что я читал в нескольких местах сейчасчто значение, которое устанавливается в поле, связанном с аннотацией @Version, не следует редактировать вручную.Вопрос в том, является ли это просто рекомендацией для нормального использования, но мой подход на самом деле сработает, или это нечто более фундаментальное, и есть другие причины не устанавливать поле версии вручную?

Наш стек является угловымСерверная часть end / Spring + JPA (Hibernate), так что имейте в виду, что весь обмен данными от внешнего интерфейса до внутреннего выполняется по REST, и мы конвертируем объекты Java в / из JSON.Итак, наше обычное редактирование / сохранение должно выглядеть примерно так:

  1. Браузер делает запрос на редактирование сущности с помощью идентификатора
  2. Бэкэнд получает запрос, ищет сущность, используяJPA преобразует сущность в JSON, отправляет в ответ клиенту.
  3. Браузер получает JSON из ответа, преобразует в объект, рисует и предварительно заполняет форму данными из редактируемого объекта.
  4. Пользователь вносит изменения и отправляет форму.Браузер отправляет новый запрос в бэкэнд с JSON, представляющим измененную сущность.
  5. Бэкэнд ищет сущность, используя JPA, модифицирует ее и сохраняет ее, используя JPA.

Для ясностина шаге 5, если мы используем аннотацию @Version и не устанавливаем ее вручную, версия не изменится, и у нас все еще будет проблема, когда один пользователь, отправляющий форму, потенциально перезапишет изменения другого.Я полагаю, что интерфейс отслеживает номер версии, отправляет его обратно на сервер с изменениями, а на шаге 5 сервер задает номер версии для извлеченного объекта. Если это произойдет, не будетсбой сохранения, который непреднамеренно перезаписывает сохранение предыдущего пользователя?

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