Единственный способ избежать двух вызовов БД - использовать оператор обновления для обновления только тех полей, которые у вас есть. Например,
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: вы должны создать исключение для отката транзакции.