Подробно о том, как сбрасывается Hibernate - PullRequest
1 голос
/ 03 августа 2020

Я не смог найти информацию, как на самом деле метод sh Hibernates flu работает под капотом. Я нашел информацию о том, что «метод flu sh синхронизирует объект сохранения с базой данных», но как это выглядит в деталях?
Я использую Java JPA с реализацией Hibernate.
Предположим, у нас есть объект User с полями

public class User{
private Long id;
private String firstName;
private String lastName;
private String email;
private UserStatus status;
private Double longitude;
private Double latitude;
}

У нас есть метод «A», который является @ Transactional.
Вначале мы читаем этот объект из БД и, основываясь на его статусе, хотели бы обновлять его координаты (longiture / latitude) текущими значениями или нет. Мы устанавливаем новые координаты.
Там появляется основная часть вопросов о сообщениях.
Я знаю, что когда транзакция завершена, текущее состояние объекта сбрасывается и фиксируется. Но как спящий режим синхронизировать этот объект? Проверяет ли он «поле за полем», если конкретное значение поля такое же, как в столбце, или он «помнит», использовали ли мы SETTER для поля?

Вопрос важен, когда другой транзакционный метод «B» хочет update firstName того же пользовательского объекта.
Рассмотрим пример:

  1. Запуск метода A и чтение значений объекта из БД
  2. Запуск метода B и прочитать тот же объект из БД
  3. Метод A обновить пользователя firstName и завершить транзакцию
  4. Метод B обновить пользователя coordinates и завершить транзакцию

Что случилось чем? Будет ли метод B переопределить firstName в БД, если значения устойчивости отличаются от значений в БД, но никогда не затрагиваются этим методом? Или будут обновлены только координаты, пока касались только их.

...