2011-02-08 79 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可以正常工作。

參見:

相關問題