2010-08-12 76 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不會提交到審計表。

解決方法是將測試設置爲無回滾的集成測試。然後我的審計記錄開始顯示出來。