Я не смог найти информацию, как на самом деле метод 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
того же пользовательского объекта.
Рассмотрим пример:
- Запуск метода A и чтение значений объекта из БД
- Запуск метода B и прочитать тот же объект из БД
- Метод A обновить пользователя
firstName
и завершить транзакцию
- Метод B обновить пользователя
coordinates
и завершить транзакцию
Что случилось чем? Будет ли метод B переопределить firstName в БД, если значения устойчивости отличаются от значений в БД, но никогда не затрагиваются этим методом? Или будут обновлены только координаты, пока касались только их.