Обновится ли сущность, если в транзакции обновить поля сущности и без вызова save

«Обновится ли сущность, если в транзакции обновить поля сущности и без вызова save» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В JPA/Hibernate сущность обновится в БД даже без явного вызова save(), если изменения произошли внутри активной транзакции и транзакция завершилась успешно (commit). Это работает благодаря механизму автоматического "dirty checking".

Пример:

@Transactional
public void updateUser(Long userId) {
    User user = userRepository.findById(userId).orElseThrow();
    user.setName("New Name"); // Изменение будет сохранено при коммите
    // save() не вызывается явно
}

Условия для автоматического обновления:

  1. Сущность находится в состоянии managed (привязана к текущей сессии)
  2. Изменения происходят внутри транзакции
  3. Транзакция завершается успешно (commit)

Исключение: если используется readOnly=true в транзакции, изменения не сохранятся.