Spring 3.x и Hibernate Envers

У меня возникла проблема с запуском Hibernate Envers в нашей среде. Мы используем Spring 3.x с LoadTimeWeaving. Ниже представлен наш контекстный файл:

<context:annotation-config/>
<context:spring-configured/>
<context:load-time-weaver aspectj-weaving="autodetect"/>
<context:component-scan base-package="com.viridityenergy.vpower"/>
<context:property-placeholder location="classpath:db/database-test.properties"/>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

<bean id="dataSourcePooled"
    class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close"
    p:jdbcUrl="${database.url}"
    p:user="${database.username}"
    p:password="${database.password}"
    p:initialPoolSize="1"
    p:maxPoolSize="5"
    p:idleConnectionTestPeriod="500"
    p:acquireIncrement="1"
    p:maxStatements="50"
    p:numHelperThreads="1"
    p:autoCommitOnClose="true"/>

<bean id="jpaAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
    p:databasePlatform="${database.platform}"
    p:showSql="${database.showSql}"
    p:generateDdl="${database.generateDdl}"/>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:persistenceUnitName="TEST"
    p:persistenceXmlLocation="META-INF/persistence.xml"
    p:dataSource-ref="dataSourcePooled"
    p:jpaVendorAdapter-ref="jpaAdapter">

  <property name="loadTimeWeaver">
    <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
  </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="entityManagerFactory"
    p:dataSource-ref="dataSourcePooled"/>

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

Вот наш файл persistence.xml

<persistence-unit name="TEST" transaction-type="RESOURCE_LOCAL">

  <provider>org.hibernate.ejb.HibernatePersistence</provider>

  <properties>
    <property name="hibernate.ejb.event.post-insert"
            value="org.hibernate.envers.event.AuditEventListener"/>

    <property name="hibernate.ejb.event.post-update"
            value="org.hibernate.envers.event.AuditEventListener"/>

    <property name="hibernate.ejb.event.post-delete"
            value="org.hibernate.envers.event.AuditEventListener"/>

    <property name="hibernate.ejb.event.pre-collection-update"
            value="org.hibernate.envers.event.AuditEventListener"/>

    <property name="hibernate.ejb.event.pre-collection-remove"
            value="org.hibernate.envers.event.AuditEventListener"/>

    <property name="hibernate.ejb.event.post-collection-recreate"
            value="org.hibernate.envers.event.AuditEventListener"/>

  </properties>
</persistence-unit>

Таблицы аудита настроены правильно, но когда объект сохраняется, в таблицах аудита не сохраняются записи. Есть только два поля, которые проверяются. Кроме того, поскольку мы используем loadTimeWeaving, когда мы запускаем модульный тест, нам необходимо иметь -javaagent:/Users/TEST/.m2/repository/org/springframework/spring-instrument/3.0.3.RELEASE/spring-instrument- 3.0.3.RELEASE.jar в качестве аргумента JVM, поэтому loadTimeWeaving работает.

Кроме Envers, все остальное работает нормально.

Любая помощь приветствуется.


person DKD    schedule 12.08.2010    source источник


Ответы (1)


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

Исправление состояло в том, чтобы настроить тест как интеграционный тест без отката. Затем начали появляться мои аудиторские записи.

person DKD    schedule 17.08.2010