Spring 3.x 和 Hibernate Envers

Posted

技术标签:

【中文标题】Spring 3.x 和 Hibernate Envers【英文标题】:Spring 3.x and Hibernate Envers 【发布时间】:2011-03-28 16:33:07 【问题描述】:

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

<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,其他一切都很好。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我发现了问题所在,因此对于可能遇到此问题的其他人,这里是。 Envers实际上一直在工作。我没有意识到的是,在我的单元测试中,所有内容都包装在一个事务中,然后回滚。在初始事务提交并完成之前,Envers 不会提交到审计表。

解决方法是将测试设置为没有回滚的集成测试。然后我的审计记录开始出现。

【讨论】:

以上是关于Spring 3.x 和 Hibernate Envers的主要内容,如果未能解决你的问题,请参考以下文章

spring+orm框架的兼容问题

struts2+spring+hibernate整合步骤《开源》

struts2+spring+hibernate整合步骤《开源》

项目教程:Struts2.x+Spring3.x+Hibernate4.x+jquery2.x+EasyUI1.3.x项目开发

Spring整合Hibernate与Struts

Spring-boot & hibernate,使用事务