2010-08-12 167 views
0

我在使Hibernate Envers在我们的环境中工作时遇到问题。我们使用Spring 3.x和LoadTimeWeaving。下面是我们的环境文件:Spring 3.x和Hibernate Envers

<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,其他一切正常。

任何帮助将不胜感激。

回答

5

我发现问题是什么,所以对于任何可能遇到此问题的人来说,都是这样。 Envers实际上一直在工作。我没有意识到的是,在我的单元测试中,所有东西都被封装在单个事务中,然后回滚。在初始事务提交并完成之前,Envers不会提交到审计表。

解决方法是将测试设置为无回滚的集成测试。然后我的审计记录开始显示出来。