Hibernate Envers с помощью Spring с помощью HibernateTemplate - PullRequest
2 голосов
/ 08 февраля 2011

Я пытаюсь настроить Envers в среде Spring.Все работает нормально, когда я извлекаю сеанс вручную из 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.Я подозреваю, что причиной может быть с использованием HibernateTemplate в DAO.

HibernateDaoSupport dao;
...
HibernateTemplate hibernateTemplate = dao.getHibernateTemplate();
TestEntity test = new TestEntity();
test.setTest("REV1");
hibernateTemplate.saveOrUpdate(test);
test.setTest("REV2");
hibernateTemplate.saveOrUpdate(test);

Мой Spring-config для 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>

Я прочиталдовольно много записей на форумах и в блогах, включая эту , на которую ссылается FAQ из Envers, но ничто из упомянутого там, похоже, не работает в моей ситуации.

Кто-нибудь знает, еслиМожно ли настроить Envers для совместной работы со Spring, используя HibernateTemplate (вместо JPA)?Какие части моей конфигурации мне нужно изменить?На какую часть документации / API Hibernate стоит обратить внимание в этом контексте (боюсь, я еще не специалист по Hibernate)?Может ли кто-нибудь предоставить пример кода рабочей конфигурации?

Я использую Spring 3.0.1 и Hibernate 3.5.1.

1 Ответ

2 голосов
/ 08 февраля 2011

Проблема вызвана тем фактом, что Envers полагается на надлежащее управление транзакциями, тогда как HibernateTemplate возвращается в режим «автоматической фиксации» при использовании вне транзакции, поэтому Envers в этом случае не работает.

Поэтому вам необходимо настроить управление транзакциями, чтобы использовать Envers.Когда внутри транзакции вызываются методы HibernateTemplate, Envers работает нормально.

См. Также:

...