【问题标题】:Hibernate Envers not working with JTA TransactionsHibernate Envers 不适用于 JTA 事务
【发布时间】:2013-08-20 17:17:36
【问题描述】:

保存休眠域对象时出现以下错误。

org.springframework.orm.hibernate4.HibernateSystemException: 无法 由于非活动事务而创建修订;嵌套异常是 org.hibernate.envers.exception.AuditException:无法创建 由于非活动事务而进行的修订

如果我禁用 envers,一切正常,对象已成功保存。

<prop key="hibernate.listeners.envers.autoRegister">false</prop>

我的设置如下

我在sessionFactory bean 中包含以下内容

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
...
      <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WeblogicTransactionManagerLookup</prop>
      <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop>
...

我正在使用以下配置查找 weblogic 数据源

<jee:jndi-lookup id="dataSource" jndi-name="jdbc.myDsXA" /> 
<tx:jta-transaction-manager />

我做错了什么?

【问题讨论】:

  • 我自己也遇到了同样的问题。我注意到没有答案,但我想知道您是否在离线状态下发现了什么?
  • 不,仍然无法正常工作

标签: spring hibernate hibernate-envers weblogic12c


【解决方案1】:

我认为您应该将“jtaTransactionManager”属性设置为 LocalSessionFactoryBean。 Hibernate 4 不再需要属性 hibernate.transaction.manager_lookup_class 和 hibernate.transaction.factory_class。

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
...
    <property name="jtaTransactionManager" ref="transactionManager" />
...
</bean>

<tx:jta-transaction-manager />

【讨论】:

  • 其实我已经有了,但我没有发布&lt;property name="jtaTransactionManager" ref="transactionManager"/&gt;
【解决方案2】:

替换属性hibernate.transaction.factory_class

来自

org.hibernate.transaction.JTATransactionFactory

到

org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory

为我解决了问题。

请看这里:http://koenserneels.blogspot.de/2012/05/migrating-from-hibernate-3-to-4-with.html

这里:https://jira.spring.io/browse/SPR-9480

【讨论】:

    【解决方案3】:
    【解决方案4】:

    在我的情况下,改变我获得会话的方式

    来自

    @Transactional(readOnly = false)
    public T save(T t) {
        Session session = sessionFactory.openSession();
    

    到

    @Transactional(readOnly = false)
    public T save(T t) {
        Session session = sessionFactory.getCurrentSession();
    

    解决了问题。

    【讨论】:

      【解决方案5】:

      看起来你本身并没有做错什么。我目前在使用 Grails 时遇到了类似的问题,从我的搜索来看,它看起来像是 Hibernate ORM 的问题:HHH-8524。链接中指定的解决方法是显式启动 Hibernate Transaction。

      【讨论】:

        猜你喜欢
        • 2020-12-07
        • 2016-12-14
        • 2017-02-05
        • 1970-01-01
        • 1970-01-01
        • 2016-08-28
        • 2014-11-05
        • 2011-06-01
        • 1970-01-01
        相关资源
        最近更新 更多