如何在 Tomcat 6 中为 Hibernate 使用 JTA 支持?
Posted
技术标签:
【中文标题】如何在 Tomcat 6 中为 Hibernate 使用 JTA 支持?【英文标题】:How to use JTA support in Tomcat 6 for Hibernate? 【发布时间】:2011-02-02 21:38:49 【问题描述】:他们建议在 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)
【问题讨论】:
好的,我需要一个 JNDI 配置的 SessionFactory。现在,当我能够通过查找获得 SessionFactory 时,我需要配置 JTA。我的家庭课程使用 getCurrentSession() ,正如我在文档中看到的那样,这只适用于 JTA 配置的环境。此外,正如我已经提到的,几乎每个人都建议在 JEE 环境中使用 JTA。 不要仅仅因为有人告诉你需要它就使用 JTA。 JTA 非常复杂,在 99% 的情况下都是不必要的。没有它,Hibernate/JPA 也能正常工作。 好的,我需要一个 JNDI 配置的 SessionFactory。 为什么? @Pascal Thivent 因为 Hibernate 开发人员在他们的文档中建议这样做。 @EugeneP 这是我倾向于在完全符合 Java EE 的服务器上使用的东西,但老实说,我从来没有找到一个好的理由(唯一的理由是当你运行 Hibernate作为 JMX 服务)。所以我可能会遗漏一些东西,但是将 SessionFactory 绑定到 HibernateUtil 类中的静态(和最终)变量对我来说是可以的(这是 Hibernate in Action 中针对 servlet 容器推荐的方法)。 【参考方案1】:如果您只想使用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 将针对整个请求而存在。
不要忘记在请求后使用过滤器关闭会话!
【讨论】:
请注意,这些参数在 Hibernate 5 中已过时。有关详细信息,请查看migration guide。我们项目的示例代码:hibernateProperties.setProperty("hibernate.transaction.jta.platform", "com.atomikos.icatch.jta.hibernate4.AtomikosPlatform");
hibernateProperties.setProperty("hibernate.transaction.coordinator_class", "jta");
【参考方案2】:
如果您希望在 Tomcat 中支持 JTA,您需要使用独立的事务管理器,例如 Atomikos、JOTM、Bitronix、SimpleJTA、JBossTS 或 GeronimoTM/Jencks。但老实说,如果您不打算处理跨多个资源的事务,那么您可以不使用 JTA(如果您真的需要 JTA,请使用完整的应用程序服务器)。
【讨论】:
Atomikos 是我的选择,它与 Hibernate 5 完美集成。以上是关于如何在 Tomcat 6 中为 Hibernate 使用 JTA 支持?的主要内容,如果未能解决你的问题,请参考以下文章
java - 如何在hibernate java中为给定的xml使用注释
如何在 Hibernate 中为每个公司创建一个 customerNumber 生成器
如何在 Hibernate 中为加入的集合指定“NOT IN”