我正在尝试在Spring环境中设置Envers。当我从SessionFactory手动检索会话并将所有内容放入Transaction:
时,一切正常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的Spring-config看起来像这样:
<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。
答案 0 :(得分:2)
问题是由于Envers依赖于正确的事务管理,而HibernateTemplate
在事务外部使用时会回退到“自动提交”模式,因此在这种情况下Envers不起作用。
因此,您需要配置事务管理才能使用Envers。在事务中调用HibernateTemplate
的方法时,Envers工作正常。
另见: