Ответ
Метод 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():
- Неявно вызывается
session.flush(): все изменения, накопленные в сущностях контекста persistence (сессии), синхронизируются с БД через SQL-операцииINSERT,UPDATE,DELETE. - Выполняется SQL-команда
COMMITдля текущей транзакции СУБД. - Транзакция Hibernate завершается.
Важно:
- В Spring-приложениях с
@Transactionalвызовcommit()выполняется автоматически при успешном завершении метода. - После
commit()управляемые сущности остаются в состоянии persistent, но привязаны к закрытой транзакции. Последующие изменения не будут автоматически сохраняться. - Вызов
commit()на неактивной транзакции выбросит исключение.