2

我正在尝试在 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 特定表没有任何反应。我怀疑原因可能是在 DAO中使用了 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>

我已经阅读了很多论坛和博客条目,包括这个链接到 Envers FAQ 的条目,但在我的情况下似乎没有提到任何内容。

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

我正在使用 Spring 3.0.1 和 Hibernate 3.5.1。

4

1 回答 1

2

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

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

也可以看看:

于 2011-02-08T18:30:45.583 回答