Hibernate Envers不使用JTA Transactions

时间:2013-08-19 00:01:20

标签: spring hibernate hibernate-envers weblogic12c

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

  

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 />

我做错了什么?

5 个答案:

答案 0 :(得分: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 />

答案 1 :(得分:1)

替换属性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

答案 2 :(得分:0)

答案 3 :(得分:0)

在我的情况下,改变了我开会的方式

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

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

解决了这个问题。

答案 4 :(得分:0)

看起来你没有做任何错误的事情。我目前正在使用Grails遇到类似的问题,在我的搜索中,它看起来像是Hibernate ORM的一个问题:HHH-8524。链接中指定的解决方法是显式启动Hibernate事务。