構成

Spring Data Envers を使用するための開始点として、クラスパスに Spring Data JPA があり、追加の spring-data-envers 依存関係があるプロジェクトが必要です。

<dependencies>

  <!-- other dependency elements omitted -->

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

</dependencies>

これにより、hibernate-envers が一時的な依存関係としてプロジェクトに組み込まれます。

Spring Data Envers と Spring Data JPA を有効にするには、2 つの Bean と特別な 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 を使用するには、拡張インターフェースとして追加して 1 つ以上のリポジトリを RevisionRepository (Javadoc) に作成します。

interface PersonRepository
    extends CrudRepository<Person, Long>,
    RevisionRepository<Person, Long, Long> (1)
{}
1 最初の型パラメーター(Person)はエンティティ型を示し、2 番目(Long)は id プロパティの型を示し、最後の型パラメーター(Long)はリビジョン番号の型を示します。デフォルト構成の Envers の場合、リビジョン番号パラメーターは Integer または Long である必要があります。

そのリポジトリのエンティティは、Envers 監査が有効になっているエンティティである必要があります(つまり、@Audited アノテーションが必要です)。

@Entity
@Audited
class Person {

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