【问题标题】:Where did the class org.hibernate.transaction.JDBCTransactionFactory go in Hibernate 5?Hibernate 5 中的 org.hibernate.transaction.JDBCTransactionFactory 类在哪里?
【发布时间】:2017-03-27 23:03:57
【问题描述】:

我目前正在做一个从 Hibernate 3.x 升级到 5.x 的项目。现在休眠配置xml中的属性之一如下:

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

在 Hibernate 5 中,上面定义的这个特定类以及包 org.hibernate.transaction 似乎不存在。但是,此类在 3.x 版本中可用 (https://docs.jboss.org/hibernate/envers/3.6/javadocs/org/hibernate/transaction/JDBCTransactionFactory.html)。 根据 Hibernate 5 api 文档没有这样的类(https://docs.jboss.org/hibernate/orm/5.0/javadocs/)

Hibernate 5 是否弃用了这个特定的包以及它所包含的所有类?我签入了所有必需的 Hibernate 5 jar,但无法在任何地方找到此类 org.hibernate.transaction.JDBCTransactionFactory。在 Hibernate 5 配置中,什么是此类的合适替代品?

我在谷歌搜索方面的成功有限,所以任何答案都将不胜感激!

【问题讨论】:

  • 我的情况相同 - 尝试从 3.3 升级到 5.2.9。

标签: hibernate migration


【解决方案1】:

好的,经过进一步研究,我发现 Hibernate 5 中的 Transaction SPI 发生了重大变化!

对应的属性应该是:

<property name="hibernate.transaction.coordinator_class">org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl</property>

或使用这样的短名称:

<property name="hibernate.transaction.coordinator_class">jdbc</property>

来自https://github.com/hibernate/hibernate-orm/blob/5.0/migration-guide.adoc#transactions

作为 5.0 的一部分,事务 SPI 也进行了重大重新设计。从用户的角度来看,这通常只在配置方面出现。以前应用程序将直接通过 org.hibernate.Transaction API 使用不同的后端事务策略。在 5.0 中,此处添加了一个间接级别。 org.hibernate.Transaction 的 API 实现现在总是一样的。在后端,org.hibernate.Transaction impl 与 org.hibernate.resource.transaction.TransactionCoordinator 对话,它根据后端事务策略表示给定 Session 的“事务上下文”。用户一般不需要关心区别。

此处注明更改是因为它可能会影响您的引导程序配置。而以前的应用程序会指定 hibernate.transaction.factory_class 并引用 org.hibernate.engine.transaction.spi.TransactionFactory FQN,在 5.0 中,新合约是 org.hibernate.resource.transaction.TransactionCoordinatorBuilder 并使用hibernate.transaction.coordinator_class 设置。有关更多详细信息,请参阅 org.hibernate.cfg.AvailableSettings.TRANSACTION_COORDINATOR_STRATEGY JavaDocs。

识别以下短名称:jdbc::(非 JPA 应用程序的默认值)表示使用基于 JDBC 的事务 (org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl) jta::说要使用基于 JTA 的事务 (org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl)

【讨论】:

    【解决方案2】:

    根据http://lists.jboss.org/pipermail/hibernate-dev/2015-November/013625.html,而不是

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

    试试这个

    <property name="transaction.factory_class">org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorBuilderImpl</property>
    

    【讨论】:

    • Hibernate 5 中的新属性名称必须是“hibernate.transaction.coordinator_class”而不是“hibernate.transaction.factory_class”。在此处查看我的更新stackoverflow.com/a/43264720/2200690
    猜你喜欢
    • 2015-11-17
    • 1970-01-01
    • 2011-11-15
    • 2016-09-16
    • 2011-04-10
    • 1970-01-01
    • 2017-08-06
    • 2017-04-13
    • 1970-01-01
    相关资源
    最近更新 更多