author-avatar
Dominik Martyniak
Hibernate 6 minut

Wprowadzenie do Envers z Hibernate w Spring Boot 3

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.

3
[spring boot 3, envers, hibernate]

Więcej od Dominik Martyniak

Więcej artykułów