Hibernate Envers to rozszerzenie Hibernate, które umożliwia śledzenie zmian w bazie danych. Dzięki Envers możesz łatwo rejestrować i przechowywać historię zmian dokonanych na encjach, co jest szczególnie przydatne w aplikacjach, gdzie konieczne jest zachowanie śladu audytowego. W tym wpisie omówie, czym jest Hibernate Envers, jak działa i jak go zaimplementować w najnowszej wersji Spring 3.
Czym jest Hibernate Envers?
Hibernate Envers jest rozszerzeniem ORM Hibernate, które umożliwia audytowanie encji. Audytowanie to proces rejestrowania zmian w danych, co pozwala na śledzenie historii tych zmian. Envers automatycznie tworzy specjalne tabele audytowe, które przechowują poprzednie wersje encji, pozwalając na łatwe odtworzenie stanu danych z przeszłości.
Jak działa Hibernate Envers?
Hibernate Envers działa poprzez rejestrowanie każdej operacji CRUD (Create, Read, Update, Delete) na encjach zarządzanych przez Hibernate. Każda zmiana jest zapisywana w specjalnych tabelach audytowych, które są automatycznie tworzone przez Envers. Te tabele zawierają informacje o każdej wersji encji, takie jak identyfikator encji, czas zmiany i wartości pól przed i po zmianie.
Przykład działania
Załóżmy, że mamy encję User
z polami id
, name
i email
. Kiedy tworzymy nowego użytkownika, Envers rejestruje tę operację w tabeli audytowej. Jeśli następnie zaktualizujemy imię użytkownika, Envers zapisze nową wersję encji z nowym imieniem oraz przechowa poprzednią wersję. W ten sposób możemy zawsze sprawdzić, jak wyglądała encja w danym momencie w przeszłości.
Implementacja Hibernate Envers w Spring 3
Aby zaimplementować Hibernate Envers w najnowszej wersji Spring 3, musimy wykonać kilka kroków:
Krok 1: Dodanie zależności
Najpierw musimy dodać zależności Hibernate Envers do naszego projektu. Jeśli używamy Maven, dodajemy poniższe zależności do pliku pom.xml lub gradle
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>6.5.2.Final</version>
</dependency>
implementation "org.hibernate.orm:hibernate-envers:6.5.2.Final"
Krok 2: Konfiguracja Hibernate
Następnie musimy skonfigurować Hibernate do używania Envers. Dodajemy konfigurację Envers do pliku application.properties
lub application.yml
:
spring.jpa.properties.hibernate.envers.audit_table_suffix = _AUD
spring.jpa.properties.hibernate.envers.revision_field_name = REV
spring.jpa.properties.hibernate.envers.revision_type_field_name = REV_TYPE
spring.jpa.properties.hibernate.envers.store_data_at_delete = true
- spring.jpa.properties.hibernate.envers.audit_table_suffix = _AUD:
Sufiks, który zostanie dodany do nazw tabel audytowych. Na przykład, jeśli masz tabelę User, tabela audytowa będzie nazwana User_AUD.
- spring.jpa.properties.hibernate.envers.revision_field_name = REV:
Określa nazwę kolumny w tabeli audytowej, która przechowuje numer rewizji. Numer rewizji identyfikuje konkretne zmiany w danych.
- spring.jpa.properties.hibernate.envers.revision_type_field_name = REV_TYPE:
Nazwa kolumny w tabeli audytowej, która przechowuje typ rewizji. Typ rewizji może mieć wartości określające, czy operacja była insercją, aktualizacją czy usunięciem.
- spring.jpa.properties.hibernate.envers.store_data_at_delete = true:
Ta właściwość określa, czy dane encji mają być przechowywane w tabeli audytowej w momencie usunięcia encji. Jeśli jest ustawiona na true, Envers zapisze stan encji przed jej usunięciem.
Krok 3: Oznaczanie encji do audytowania
Aby oznaczyć encję do audytowania, dodajemy adnotację @Audited
do klasy encji. Na przykład:
import org.hibernate.envers.Audited;
@Entity
@Audited
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
Krok 4: Dostęp do danych audytowych
Hibernate Envers udostępnia API do pracy z danymi audytowymi. Możemy użyć klasy AuditReader
do pobierania wersji encji. Na przykład:
import org.hibernate.envers.AuditReader;
import org.hibernate.envers.AuditReaderFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
@Service
public class UserService {
@Autowired
private EntityManager entityManager;
public User getUserAtRevision(Long userId, int revision) {
AuditReader auditReader = AuditReaderFactory.get(entityManager);
return auditReader.find(User.class, userId, revision);
}
}
Zalety używania Hibernate Envers
- Automatyzacja: Envers automatycznie tworzy i zarządza tabelami audytowymi.
- Historia zmian: Możliwość śledzenia historii zmian encji.
- Łatwa integracja: Prosta integracja z istniejącymi aplikacjami Hibernate i Spring.
- Konfigurowalność: Wiele opcji konfiguracji pozwalających dostosować działanie Envers do potrzeb projektu.
Podsumowanie
Hibernate Envers to potężne narzędzie do audytowania encji w aplikacjach korzystających z Hibernate. Dzięki Envers możemy łatwo śledzić zmiany w danych, co jest nieocenione w aplikacjach wymagających śladu audytowego. Wprowadzenie Envers w Spring 3 jest proste i wymaga jedynie kilku kroków konfiguracji. Dodanie audytowania do projektu może znacząco poprawić jego funkcjonalność i zgodność z wymaganiami dotyczącymi przechowywania historii zmian danych.