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からリンクされている、これを含むフォーラムやブログのエントリをかなりたくさん読んだことがありますが、私の状況では何も機能していないようです。

(JPAの代わりに)HibernateTemplateを使用してSpringと連携するようにEnversを構成できるかどうか誰かが知っていますか?構成のどの部分を変更する必要がありますか?このコンテキストでHibernateドキュメント/APIのどの部分を見る価値がありますか(私はまだHibernateの専門家ではないのではないかと思います)?誰かが動作する構成のコードサンプルを提供できますか?

Spring3.0.1とHibernate3.5.1を使用しています。

4

1 に答える 1

2

この問題は、Enversが適切なトランザクション管理に依存しているのに対しHibernateTemplate、トランザクションの外部で使用されると「自動コミット」モードにフォールバックするため、この場合Enversは機能しないという事実が原因です。

したがって、Enversを使用するには、トランザクション管理を構成する必要があります。のメソッドがトランザクション内で呼び出されるとHibernateTemplate、Enversは正常に機能します。

参照:

于 2011-02-08T18:30:45.583 に答える