author-avatar
Dominik Martyniak
Spring Data Envers 6 minut

Spring Data Envers – jeszcze prostszy audyt encji w Spring Boot

Audytowanie danych w aplikacjach biznesowych jest dziś standardem. Chcesz wiedzieć, kto zmodyfikował rekord? Kiedy usunięto konkretną wartość? Albo porównać wersję danych sprzed miesiąca z aktualną? Wszystko to możesz zrealizować w Spring Boot dzięki Hibernate Envers. Ale możesz to zrobić jeszcze łatwiej dzięki dodatkowi: spring-data-envers.

W poprzednim wpisie (Wprowadzenie do Envers z Hibernate w Spring Boot 3) pokazałem, jak krok po kroku uruchomić Enversa i zapisywać historię zmian w bazie danych. W tym artykule idziemy krok dalej i pokażę Ci, jak z pomocą biblioteki spring-data-envers możesz zyskać ogromną wygodę i przejrzystość w obsłudze rewizji.

Czym jest spring-data-envers?

To rozszerzenie Spring Data JPA, które automatyzuje dostęp do danych rewizyjnych (czyli historii zmian) poprzez znane Ci interfejsy repozytoriów. Nie musisz sam budować zapytań HQL, korzystać bezpośrednio z API Enversa ani rozumieć wewnętrznej struktury tabel _AUD. Wszystko masz pod ręką – jak w typowym JpaRepository.

Dzięki spring-data-envers możesz:

  • Wyświetlać listę wszystkich rewizji encji,
  • Odczytywać konkretną rewizję po jej numerze,
  • Uzyskać informacje o użytkowniku i dacie rewizji (przy odpowiedniej konfiguracji),

Dodanie zależności

Wystarczy jedna zależność w Twoim projekcie:

Dla Gradle:

implementation 'org.springframework.data:spring-data-envers'

Dla Maven:

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

Konfiguracja

Wymagana konfiguracja – EnversRevisionRepositoryFactoryBean

Aby spring-data-envers poprawnie działał z Twoimi repozytoriami, musisz skonfigurować Spring Data JPA, aby używał fabryki repozytoriów zgodnej z Envers. W tym celu należy dodać adnotację:

@EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class)

Najczęściej dodaje się ją w głównej klasie konfiguracyjnej aplikacji Spring Boot:

@SpringBootApplication
@EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class)
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}
  1. Upewnij się, że Twoja encja jest oznaczona adnotacją @Audited.
  2. Upewnij się, że masz włączony Envers w pliku application.properties lub application.yml:
spring.jpa.properties.org.hibernate.envers.store_data_at_delete=true
spring.jpa.properties.org.hibernate.envers.global_with_modified_flag=true
  1. Stwórz repozytorium dziedziczące po RevisionRepository:
public interface ProductRepository extends RevisionRepository<Product, Long, Long>, JpaRepository<Product, Long> {
}

Teraz masz dostęp do metod takich jak:

  • findRevisions(ID id) – zwraca historię zmian encji,
  • findLastChangeRevision(ID id) – zwraca ostatnią rewizję,
  • findRevision(ID id, N) – zwraca konkretną rewizję.

Bez tej konfiguracji metody takie jak findRevisions(...) lub findLastChangeRevision(...) mogą nie działać poprawnie.

Praktyczny przykład

Załóżmy, że masz encję Product z audytem :

@Entity
@Audited
public class Product {
    @Id
    private Long id;
    private String name;
    private BigDecimal price;
}

Użytkownik edytuje produkt kilka razy. Aby uzyskać historię zmian, wystarczy wywołać:

List<Revision<Integer, Product>> revisions = productRepository.findRevisions(productId).getContent();
for (Revision<Integer, Product> rev : revisions) {
    System.out.println("Rev  id#" + rev.getRevisionNumber().orElse(-1) +
                       ": " + rev.getEntity().getName());
}
 

Możesz też pobrać konkretną rewizję (np. rewizję numer 2):

 
Optional<Revision<Integer, Product>> rev = productRepository.findRevision(1L, 2);
rev.ifPresent(r -> {
    System.out.println("Reev 2: " + r.getEntity().getPrice());
});
 

Czysty Envers vs. spring-data-envers

Czysty Hibernate Envers Spring Data Envers
Potrzeba ręcznie pisać zapytania HQL Wbudowane metody w repozytorium
Dostęp przez AuditReader Dostęp przez Spring Data
Trudniejsza paginacja, sortowanie Pełne wsparcie Spring Data Pageable

Kiedy warto używać spring-data-envers?

To idealne narzędzie, gdy:

  • Budujesz aplikację z użyciem Spring Data JPA,
  • Chcesz błyskawicznie wyświetlić historię zmian danych użytkownika, produktu lub dokumentu,
  • Potrzebujesz integracji historii zmian z frontendem (np. Angular/React),
  • Nie chcesz samodzielnie implementować logiki odczytu rewizji.

Podsumowanie

Spring Data Envers to lekki i wygodny sposób na integrację historii zmian encji z Twoją aplikacją opartą na Spring Boot. Oszczędzasz czas, zmniejszasz liczbę błędów i zyskujesz bardzo czytelne API.

Jeśli do tej pory korzystałeś tylko z „czystego” Enversa, zdecydowanie warto spróbować tego rozszerzenia. Integracja jest błyskawiczna, a efekt – profesjonalny.

 

3
[spring boot, spring data envers, envers]

Więcej od Dominik Martyniak

Więcej artykułów