Дизайн DAO для обновления сущности в БД - PullRequest
1 голос
/ 04 августа 2020

Допустим, клиент обновляет объект (например, объект "студент"). Итак, мы получаем от клиента идентификатор студента и другие измененные поля (не все поля).

Я читал, что мы должны передать конкретный объект сущности в DAO для обновления. Но тогда, как мне сформировать этот объект сущности? Потому что у меня нет данных всех полей для создания правильного объекта сущности.

Следует ли мне сделать два вызова БД?

Первый вызов - создать правильный объект сущности, а затем выполнить обновление, передав этот обновленный объект сущности в DAO.

1 Ответ

1 голос
/ 05 августа 2020

Единственный способ избежать двух вызовов БД - использовать оператор обновления для обновления только тех полей, которые у вас есть. Например,

UPDATE Student SET someField1 = :field1, someField2 = :field2 WHERE ID = :id

Помните, что запросы на обновление обходят проверки блокировки optimisti c. Если вы используете блокировку optimisti c, вам следует добавить версию в предложение where, а также увеличить ее.

UPDATE Student SET someField1 = :field1, version = version + 1 WHERE id = :id AND version = :version

После выполнения executeUpdate необходимо проверить затронутые строки:

  • 1: все в порядке
  • 0: объект не может быть найден по его идентификатору. Возможно, он тем временем был удален или версия не совпадала. В обоих случаях вы должны вызвать исключение OptimisticLockException.
  • > 1: вы должны создать исключение для отката транзакции.
...