22

他们建议在 Java EE 环境中使用 JTA 事务支持。

但是如何在 Tomcat6 中配置 JTA 以便 Hibernate Session 可以使用它呢?

从版本 3.0.1 开始,Hibernate 添加了该SessionFactory.getCurrentSession()方法。最初,这假定使用 JTA 事务,其中 JTA 事务定义了当前会话的范围和上下文。鉴于众多独立 JTA TransactionManager 实现的成熟度,大多数(如果不是全部)应用程序都应该使用 JTA 事务管理,无论它们是否部署到 J2EE 容器中。基于此,您只需要使用基于 JTA 的上下文会话。

Hibernate 参考文档 | 架构。上下文会话

4

2 回答 2

33

如果您想在 Tomcat 中支持 JTA,您需要使用独立的事务管理器,如AtomikosJOTMBitronixSimpleJTAJBossTSGeronimoTM/Jencks。但老实说,如果您不打算处理跨多个资源的事务,那么您可以不使用 JTA(如果您真的需要 JTA,请使用完整的应用程序服务器)。

于 2010-03-31T12:56:23.967 回答
6

如果你只是想使用SessionFactory.getCurrentSession()你可以将以下两行添加到你的 hibernate.cfg.xml 中:

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

这将为您提供每个线程的唯一会话。由于 servlet 请求始终在一个线程中处理(假设您的代码不会产生新的),因此 Session 将针对整个请求而存在。

不要忘记在请求后使用过滤器关闭会话!

于 2010-03-31T13:01:51.367 回答