Как и когда использовать метод commit() в Hibernate?

«Как и когда использовать метод commit() в Hibernate?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод commit() вызывается у объекта Transaction для фиксации текущей единицы работы в базе данных. Он завершает транзакцию, синхронизируя состояние контекста persistence с БД.

Типичный шаблон использования в чистом Hibernate:

Session session = sessionFactory.openSession();
Transaction transaction = null;
try {
    transaction = session.beginTransaction(); // Начало транзакции

    // Бизнес-логика: работа с сущностями
    Employee emp = new Employee("John Doe", "Engineering");
    session.persist(emp); // Сущность становится управляемой (persistent)

    // ... другие операции

    transaction.commit(); // ФИКСАЦИЯ: все изменения сбрасываются (flush) в БД и транзакция завершается
} catch (Exception e) {
    if (transaction != null) {
        transaction.rollback(); // Откат в случае ошибки
    }
    throw e;
} finally {
    session.close(); // Закрытие сессии
}

Что происходит при вызове commit():

  1. Неявно вызывается session.flush(): все изменения, накопленные в сущностях контекста persistence (сессии), синхронизируются с БД через SQL-операции INSERT, UPDATE, DELETE.
  2. Выполняется SQL-команда COMMIT для текущей транзакции СУБД.
  3. Транзакция Hibernate завершается.

Важно:

  • В Spring-приложениях с @Transactional вызов commit() выполняется автоматически при успешном завершении метода.
  • После commit() управляемые сущности остаются в состоянии persistent, но привязаны к закрытой транзакции. Последующие изменения не будут автоматически сохраняться.
  • Вызов commit() на неактивной транзакции выбросит исключение.