使用HibernateTemplate使用Spring休眠环境

使用HibernateTemplate使用Spring休眠环境,hibernate,spring,hibernate-envers,Hibernate,Spring,Hibernate Envers,我正在尝试在Spring环境中设置Envers。当我从SessionFactory手动检索会话并将所有内容放入事务中时,一切正常: Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); TestEntity test = new TestEntity(); test.setTest("REV1"); session.save(test); tx.commit();

我正在尝试在Spring环境中设置Envers。当我从SessionFactory手动检索会话并将所有内容放入事务中时,一切正常:

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的表不会发生任何变化。我怀疑原因可能在刀上

HibernateDaoSupport dao;
...
HibernateTemplate hibernateTemplate = dao.getHibernateTemplate();
TestEntity test = new TestEntity();
test.setTest("REV1");
hibernateTemplate.saveOrUpdate(test);
test.setTest("REV2");
hibernateTemplate.saveOrUpdate(test);
SessionFactory的Spring配置如下所示:

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

org.hibernate.dial.h2方言
更新
我已经阅读了很多论坛和博客的文章,包括链接到Envers常见问题解答的文章,但是在我的情况下没有提到任何东西

是否有人知道,是否可以使用HibernateTemplate(而不是JPA)将Envers配置为与Spring一起工作?我需要更改配置的哪些部分?在这种情况下,Hibernate文档/API的哪一部分值得一看(恐怕我还不是Hibernate专家)?有人能提供一个工作配置的代码示例吗


我使用的是Spring 3.0.1和Hibernate 3.5.1。

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


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

另请参见:


HibernateTemplate
没有做任何有趣的事情,它只是稍微简化了HibernateAPI。事实上,当前的Spring文档鼓励您不要使用
HibernateTemplate
,不再需要了。我认为你的问题在别处。你如何管理交易?谢谢你的回答。我在应用程序中定义了一个事务管理器,但在集成测试中缺少一些配置。将@TransactionConfiguration(transactionManager=“transactionManager”,defaultRollback=false)和@Transactional放在我的测试类上,并扩展AbstractTransactionalTestNGSpringContextTests,最终成功了。