Hibernate Session.close() автоматически откатывает незафиксированные транзакции?

В настоящее время я читаю документацию Hibernate, и я наткнулся на следующую цитату:

Если сеанс вызывает исключение, включая любое SQLException, немедленно откат транзакции базы данных, вызовите Session.close() и отмените экземпляр сеанса. Некоторые методы сеанса не оставляют сеанс в согласованном состоянии. Никакое исключение, вызванное Hibernate, не может рассматриваться как подлежащее восстановлению. Убедитесь, что сессия будет закрыта вызовом функции close() в блоке finally.

Все это имеет смысл, насколько мне известно, но меня заставляет задуматься, что эффект закрытия сеанса происходит с транзакцией, которая не была зафиксирована и не откатна?

Например, рассмотрим следующее:

  session = getSessionFactory().openSession();
  session.beginTransaction();
  session.save(carObject);
  //session.getTransaction().commit();
  session.close();

С фиксацией комментирования и отсутствием отката здесь, каково ожидаемое поведение session.close()? Это просто откат, который совершает автоматически, оставляет ли он "вешающую" транзакцию? и др.

(Я понимаю, что это, очевидно, не было бы хорошей практикой - я просто пытаюсь немного осветить основные концепции).

Ответ 1

Я немного перебрался в Hibernate:

Сплошные сеансы сохраняют свой жизненный цикл несколько независимым от JDBC-соединений. Когда вы закрываете Hibernate Session, соединение будет отпущено. Точное значение "освобождения соединения" зависит от того, как было получено соединение :

  • Если соединение было предоставлено вручную (например, через sessionFactory.openStatelessSession(connection)), вы получите свое соединение с возможной незавершенной транзакцией при вызове session.close()
  • в других случаях вызов session.close() обычно заканчивается вызовом connection.close()

Автоматическая очистка сеанса или фиксация транзакции/откат не производится с помощью Hibernate. Те же самые состояния для JPA EntityManager.

Итак, что происходит в конце, зависит от вашего провайдера/источника данных. С C3PO любая незавершенная транзакция будет отменена, когда соединение будет возвращено в пул. С другой стороны, если вы управляете соединением JTA, то фактическая обработка транзакций может быть полностью недоступна вашему приложению.