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);
}
}
- Upewnij się, że Twoja encja jest oznaczona adnotacją
@Audited
.
- 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
- 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.