Configuration

作为使用 Spring Data Envers 的起点,您需要一个在类路径中包含 Spring Data JPA 的项目以及一个额外的 spring-data-envers 依赖项:

As a starting point for using Spring Data Envers, you need a project with Spring Data JPA on the classpath and an additional spring-data-envers dependency:

<dependencies>

  <!-- other dependency elements omitted -->

  <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-envers</artifactId>
    <version>{version}</version>
  </dependency>

</dependencies>

这也将 hibernate-envers 作为瞬态依赖项引入到项目中。

This also brings hibernate-envers into the project as a transient dependency.

要启用 Spring Data Envers 和 Spring Data JPA,我们需要配置两个 bean 和一个特殊的 repositoryFactoryBeanClass:

To enable Spring Data Envers and Spring Data JPA, we need to configure two beans and a special repositoryFactoryBeanClass:

@Configuration
@EnableEnversRepositories
@EnableTransactionManagement
public class EnversDemoConfiguration {

	@Bean
	public DataSource dataSource() {

		EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
		return builder.setType(EmbeddedDatabaseType.HSQL).build();
	}

	@Bean
	public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

		HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
		vendorAdapter.setGenerateDdl(true);

		LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
		factory.setJpaVendorAdapter(vendorAdapter);
		factory.setPackagesToScan("example.springdata.jpa.envers");
		factory.setDataSource(dataSource());
		return factory;
	}

	@Bean
	public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {

		JpaTransactionManager txManager = new JpaTransactionManager();
		txManager.setEntityManagerFactory(entityManagerFactory);
		return txManager;
	}
}

要实际使用 Spring Data Envers,通过添加一个扩展接口,将一个或多个仓库变成 RevisionRepository

To actually use Spring Data Envers, make one or more repositories into a RevisionRepository by adding it as an extended interface:

interface PersonRepository
    extends CrudRepository<Person, Long>,
    RevisionRepository<Person, Long, Long> (1)
{}
1 The first type parameter (Person) denotes the entity type, the second (Long) denotes the type of the id property, and the last one (Long) is the type of the revision number. For Envers in default configuration, the revision number parameter should be Integer or Long.

该存储库的实体必须是启用了 Envers 审计的实体(即,它必须具有 @Audited 注解):

The entity for that repository must be an entity with Envers auditing enabled (that is, it must have an @Audited annotation):

@Entity
@Audited
class Person {

	@Id @GeneratedValue
	Long id;
	String name;
	@Version Long version;
}