Без JTA управление транзакциями осуществляется с помощью методов фиксации/отката JDBC Connection.
Это означает, что вам необходимо привязать одно соединение JDBC к текущему сеансу Hibernate и текущей логической транзакции.
Поскольку передача JDBC-соединения для всех методов сеанса Hibernate была бы ужасным конструктивным решением, вместо этого вы должны использовать локальное хранилище Thread.
Hibernate имеет гибкую CurrentSessionContext, предлагая следующие альтернативы:
- JTASessionContext
- ManagedSessionContext
- ThreadLocalSessionContext
Так что, если вы выбираете ThreadLocaSessionContext, то базовое соединение JDBC будет связанный с локальным хранилищем Thread и сделать его доступным для текущего сеанса Thread running.
Если вы используете Spring, вы не должны полагаться на контекст Hibernate TreadLocal, но использовать Spring конкретную поддержку управления транзакциями, которая осуществляется:
- SpringJtaSessionContext
- SpringSessionContext
Что касается состояния прокси , то Hibernate TreadLocalContext использует прокси-сервер для сеанса Hibernate:
protected Session wrap(Session session) {
final TransactionProtectionWrapper wrapper = new TransactionProtectionWrapper(session);
final Session wrapped = (Session) Proxy.newProxyInstance(
Session.class.getClassLoader(),
SESSION_PROXY_INTERFACES,
wrapper
);
wrapper.setWrapped(wrapped);
return wrapped;
}
, позволяющий текущему сеансу unbind сам формирует хранилище TreadLocal при вызове метода Session.close().
// If close() is called, guarantee unbind()
if ("close".equals(methodName)) {
unbind(realSession.getSessionFactory());
}