他们建议在Java EE环境中使用JTA事务支持。
但是如何在Tomcat6中配置JTA以便Hibernate Session可以使用它?
从版本3.0.1开始,Hibernate添加了
SessionFactory.getCurrentSession()
方法。最初,这假定使用JTA事务,其中JTA事务定义了当前会话的范围和上下文。鉴于众多独立JTA TransactionManager实现的成熟度,大多数(如果不是全部)应用程序应该使用JTA事务管理,无论它们是否部署到J2EE容器中。基于此,您需要使用基于JTA的上下文会话。
(Hibernate Reference Documentation | Architecture. Contextual Sessions)功能
答案 0 :(得分:33)
如果您希望在Tomcat中支持JTA,则需要使用独立的事务管理器,如Atomikos,JOTM,Bitronix,SimpleJTA,JBossTS或GeronimoTM/Jencks。但老实说,如果你不打算跨多个资源处理事务,那么你可以在没有JTA的情况下生活(如果你真的需要JTA,那就使用一个完整的应用程序服务器)。
答案 1 :(得分: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将为整个请求提供服务。
请勿忘记在请求后使用过滤器关闭会话!