Как использовать поддержку JTA в Tomcat 6 для Hibernate?

Они рекомендуют использовать поддержку транзакций JTA в среде Java EE.

Но как настроить JTA в Tomcat6, чтобы сеанс Hibernate мог его использовать?

Начиная с версии 3.0.1, Hibernate добавил метод SessionFactory.getCurrentSession(). Первоначально это предполагало использование транзакций JTA, где транзакция JTA определяла как объем, так и контекст текущего сеанса. Учитывая зрелость многочисленных автономных реализаций JTA TransactionManager, большинство, если не все, приложения должны использовать управление транзакциями JTA, независимо от того, развернуты они в контейнере J2EE или нет. Исходя из этого, контекстные сеансы на основе JTA - это все, что вам нужно для использования.

(Справочник по Hibernate Документация | Архитектура. Контекстные сессии)


person EugeneP    schedule 31.03.2010    source источник
comment
Хорошо, мне нужен настроенный JNDI SessionFactory. Теперь, когда я могу получить SessionFactory через поиск, мне нужно настроить JTA. Мои домашние классы используют getCurrentSession (), и, как я могу прочитать в документации, это работает только в среде, сконфигурированной JTA. Кроме того, как я уже упоминал, практически все рекомендуют использовать JTA в среде JEE.   -  person EugeneP    schedule 31.03.2010
comment
Не используйте JTA только потому, что кто-то сказал вам, что он вам нужен. JTA очень сложен и не нужен в 99% ситуаций. Hibernate / JPA будет нормально работать и без него.   -  person skaffman    schedule 31.03.2010
comment
Хорошо, мне нужен настроенный JNDI SessionFactory. Почему?   -  person Pascal Thivent    schedule 31.03.2010
comment
@Pascal Thivent Потому что разработчики Hibernate в своей документации рекомендуют это делать.   -  person EugeneP    schedule 31.03.2010
comment
@EugeneP Это то, что я обычно использую с сервером, полностью совместимым с Java EE, но, честно говоря, мне никогда не удавалось найти хорошее оправдание (единственное, когда вы запускаете Hibernate как службу JMX). Так что мне может чего-то не хватать, но привязка SessionFactory к статической (и конечной) переменной в классе HibernateUtil мне подходит (и это рекомендуемый подход в Hibernate in Action для контейнера сервлетов).   -  person Pascal Thivent    schedule 31.03.2010


Ответы (2)


Если вам нужна поддержка JTA в Tomcat, вам понадобится автономный менеджер транзакций, например Atomikos, JOTM, Bitronix, SimpleJTA, JBossTS или GeronimoTM / Jencks. Но, честно говоря, если вы не собираетесь обрабатывать транзакции через несколько ресурсов, вы можете жить без JTA (а если вам действительно нужен JTA, используйте полноценный сервер приложений).

person Pascal Thivent    schedule 31.03.2010
comment
Я выбрал Atomikos, прекрасно интегрированный с Hibernate 5. - person Ursache; 22.03.2018

Если вы просто хотите использовать SessionFactory.getCurrentSession(), вы можете просто добавить следующие две строки в свой hibernate.cfg.xml:

<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>

Это даст вам уникальный сеанс для каждого потока. Поскольку запрос сервлета всегда обрабатывается в одном потоке (учитывая, что ваш код не порождает новые), сеанс будет существовать для всего запроса.

Не забудьте использовать фильтр, чтобы закрыть Сессию после запроса!

person FRotthowe    schedule 31.03.2010
comment
Имейте в виду, что в Hibernate 5 эти параметры устарели. Для получения дополнительной информации проверьте руководство по переходу. Пример кода из нашего проекта: hibernateProperties.setProperty("hibernate.transaction.jta.platform", "com.atomikos.icatch.jta.hibernate4.AtomikosPlatform"); hibernateProperties.setProperty("hibernate.transaction.coordinator_class", "jta"); - person Ursache; 22.03.2018