2011-02-08 75 views
2

我试图在Spring环境中安装Envers。一切工作正常,当我手动通过SessionFactory获取会话,把一切事务内部:Hibernate Envers with Spring using HibernateTemplate

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
TestEntity test = new TestEntity(); 
test.setTest("REV1"); 
session.save(test); 
tx.commit(); 
tx = session.beginTransaction(); 
test.setTest("REV2"); 
session.save(test); 
tx.commit(); 

上面的代码将数据插入到TestEntity表也会更新AUD-和REVINFO桌。

但是,当我使用我们的DAO更新表时,Envers特定的表没有任何反应。我怀疑原因可能是DAO中的using HibernateTemplate

HibernateDaoSupport dao; 
... 
HibernateTemplate hibernateTemplate = dao.getHibernateTemplate(); 
TestEntity test = new TestEntity(); 
test.setTest("REV1"); 
hibernateTemplate.saveOrUpdate(test); 
test.setTest("REV2"); 
hibernateTemplate.saveOrUpdate(test); 

我的春天,配置为SessionFactory看起来是这样的:

<bean id="test-sessionFactory" class=...> 
    <property name="dataSource" ref="test-dataSource" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property> 
    <property name="eventListeners"> 
    <map> 
     <entry key="post-insert" value-ref="enversListener" /> 
     <entry key="post-update" value-ref="enversListener" /> 
     <entry key="post-delete" value-ref="enversListener" /> 
     <entry key="pre-collection-update" value-ref="enversListener" /> 
     <entry key="pre-collection-remove" value-ref="enversListener" /> 
     <entry key="post-collection-recreate" value-ref="enversListener" /> 
    </map> 
</property> 
</bean> 

我已阅读论坛 - 和博客条目包括this one颇多,即从Envers常见问题挂钩,但在我的情况下似乎没有任何提及。

有谁知道,如果可以配置Envers与Spring一起使用HibernateTemplate(而不是JPA)?我需要更改哪些部分的配置? Hibernate文档/ API的哪些部分值得关注(我恐怕我还不是Hibernate专家)?有人可以提供一个工作配置的代码示例吗?

我使用Spring 3.0.1和Hibernate 3.5.1。

+2

`HibernateTemplate`没有做什么有趣的事,它只是简化了的Hibernate API一点。事实上,目前的Spring文档鼓励你*不*使用`HibernateTemplate`,这里就不再需要了。我认为你的问题在别处。 – skaffman 2011-02-08 15:23:01

+0

你如何管理交易? – axtavt 2011-02-08 18:03:42

回答

2

问题是由Envers依赖正确的事务管理的事实引起的,而HibernateTemplate在事务外使用时会回退到“自动提交”模式,因此Envers在这种情况下不起作用。

因此,您需要配置事务管理才能使用Envers。在交易中调用HibernateTemplate的方法时,Envers可以正常工作。

参见:

相关问题