Есть несколько вещей, которые нужно выяснить.Прежде всего вам необходимо определить, какая у вас единица работы.Шаблон сеанса для запроса является одним из наиболее используемых, и если у вас нет особых потребностей, придерживайтесь этого.Если вы используете Hibernate, вы не используете операторы и наборы результатов напрямую.Hibernate сделает это за вас.что вам нужно закрыть - это сеанс гибернации
, который вы используете - это SessionFactory и объект Session.Сессия в значительной степени представляет вашу единицу работы.В спящем режиме вы получаете свои объекты, меняете их и сохраняете обратно.Сеанс для шаблона запроса открывает сеанс при получении запроса и закрывает его при отправке ответа.
В управляемом контейнером сеансовом компоненте EJB доступна транзакция и источник данных, который вы (или спящий) используете втакой контейнер автоматически обрабатывается JTA TransactionManager.
Теперь, поскольку Hibernate умен, он может автоматически привязывать «текущий» сеанс к текущей транзакции JTA.Это позволяет легко реализовать стратегию сеанса для запроса с помощью метода getCurrentSession () в вашем SessionFactory:
try {
UserTransaction tx = (UserTransaction)new InitialContext()
.lookup("java:comp/UserTransaction");
tx.begin();
// Do some work
factory.getCurrentSession().load(...);
factory.getCurrentSession().persist(...);
tx.commit();
}
catch (RuntimeException e) {
tx.rollback();
throw e; // or display error message
}
Итак, чтобы ответить на ваши вопросы:
Если вы используете Hibernate сJTA в контейнере, вам лучше использовать JPA EntityManager или, возможно, весенний спящий шаблон.
Вот несколько ссылок: http://community.jboss.org/wiki/sessionsandtransactions#Transaction_demarcation_with_JTA http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateTemplate.html