2015-06-27 35 views
0

我試圖使用spring-data-envers實現實體審計功能。問題是我公司目前仍在使用Hibernate 3,它看起來像彈簧數據envers只使用Hibernate 4.以下是我得到了錯誤的工作:如何使spring-data-envers與Hibernate 3一起工作

org.springframework.orm.jpa.JpaSystemException: You need to install the org.hibernate.envers.event.AuditEventListener class as post insert, update and delete event listener.; nested exception is org.hibernate.envers.exception.AuditException: You need to install the org.hibernate.envers.event.AuditEventListener class as post insert, update and delete event listener. 
    at org.hibernate.envers.AuditReaderFactory.get(AuditReaderFactory.java:71) 
    at org.hibernate.envers.AuditReaderFactory.get(AuditReaderFactory.java:85) 
    at org.springframework.data.envers.repository.support.EnversRevisionRepositoryImpl.findRevisions(EnversRevisionRepositoryImpl.java:127) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:414) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:399) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:371) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:122) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy30.findRevisions(Unknown Source) 
    at org.springframework.data.envers.repository.support.RepositoryIntegrationTest.returnsEmptyRevisionsForUnrevisionedEntity(RepositoryIntegrationTest.java:99) 

任何幫助表示讚賞。

回答

0

嘗試以下配置

在pom.xml中

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-envers</artifactId> 
    <version>${hibernate.version}</version> 
</dependency> 

在彈簧hibernate.xml(或任何名稱你給)

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
<property name="dataSource" ref="dataSource"/> 
<property name="packagesToScan"> 
    <list> 
     <value>com.yourpackage.model</value> 
    </list> 
</property> 
<property name="jpaVendorAdapter"> 
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
</property> 
<property name="jpaProperties"> 
    <props> 
     <prop key="hibernate.hbm2ddl.auto">replace_with_your_</prop> 
     <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
     <prop key="hibernate.show_sql">${hibernate.show.sql}</prop> 
     <prop key="hibernate.format_sql">${hibernate.format.sql}</prop> 

     <!-- Envers properties --> 
     <prop key="org.hibernate.envers.auditTablePrefix"/>    
     <prop key="org.hibernate.envers.auditTableSuffix">_HISTORY</prop>    
    </props> 
</property> 

重要防線:

<prop key="org.hibernate.envers.auditTablePrefix"></prop> 
<prop key="org.hibernate.envers.auditTableSuffix">_HISTORY</prop> 

後綴'_HISTORY'是您選擇給數據庫表的名稱,該名稱將包含您實體的不同版本。最後一個@Audited註釋放置在需要審計的實體上。

@Entity 
@Table(name = "user") 
@Audited 
public class User implements Serializable {} 
+0

如果你註冊這些休眠Envers事件? – Yingliang

+0

事件在數據庫中註冊。 Hibernate Envers將爲每個審計實體創建一個表。 –

+0

我認爲從Hibernate Envers 4開始,不需要註冊項目中的事件。但不是Hibernate Envers 3或更早版本。 – Yingliang

0

這裏是的Spring Java配置在我的項目,使彈簧數據envers作品:

@Configuration 
@EnableJpaRepositories(basePackages = "your.repository.package", repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class) 
public class ServiceModelTestSpringConfig { 

//.. Spring-JPA-Hibernate setup .. 
@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
    em.setDataSource(dataSource()); 
    em.setPackagesToScan("your.entity.package"); 

    JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
    em.setJpaVendorAdapter(vendorAdapter); 
    em.setJpaProperties(additionalProperties()); 

    return em; 
} 

@Bean 
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { 
    JpaTransactionManager transactionManager = new JpaTransactionManager(); 
    transactionManager.setEntityManagerFactory(emf); 

    return transactionManager; 
} 

@Bean 
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { 
    return new PersistenceExceptionTranslationPostProcessor(); 
} 

@Bean 
public DataSource dataSource() { 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
    dataSource.setDriverClassName("org.h2.Driver"); 
    // dataSource.setUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"); // Use in-memory database 
    dataSource.setUrl("jdbc:h2:~/test/itdata;DB_CLOSE_DELAY=-1"); // Use file database 
    dataSource.setUsername("ying"); 
    return dataSource; 
} 

Properties additionalProperties() { 
    Properties properties = new Properties(); 
    properties.setProperty("hibernate.hbm2ddl.auto", "update"); 
    properties.setProperty("hibernate.connection.autocommit", "false"); 
    properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); 
    // Hibernate Envers Event Listeners 
    properties.setProperty("hibernate.ejb.event.post-insert", "org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener"); 
    properties.setProperty("hibernate.ejb.event.post-update", "org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener"); 
    properties.setProperty("hibernate.ejb.event.post-delete", "org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener"); 
    properties.setProperty("hibernate.ejb.event.pre-collection-update", "org.hibernate.envers.event.AuditEventListener"); 
    properties.setProperty("hibernate.ejb.event.pre-collection-remove", "org.hibernate.envers.event.AuditEventListener"); 
    properties.setProperty("hibernate.ejb.event.post-collection-recreate", "org.hibernate.envers.event.AuditEventListener"); 
    return properties; 
} 
// .. EOF Spring-JPA-Hibernate setup .. 

} 
相關問題