2015-01-29 2 views
1

Я столкнулся с этой строкой относительно документации на гибернате на сайте Jboss.Что означает «прокси» для сеанса спящего режима

Because Hibernate can't bind the "current session" to a transaction, 
as it does in a JTA environment, it binds it to the current Java thread 
when i do transction demarcation with plain JDBC. 
It is opened when getCurrentSession() is called for the first time, 
but in a "proxied" state that doesn't allow you to do anything except 
start a transaction. 

Итак, что же делает автор в виду под "проксированное состояние" здесь. И какая у них ссылка, если таковая имеется, до прокси-объекты?

ответ

1

Без 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()); 
} 
Смежные вопросы