w , ,

FajneFajne Dobre!Dobre!

Hibernate #5 – jak wykorzystawać callback?

hibernate
hibernate

Czym jest callback?

Callback to mechanizm umożliwiający wykonanie kodu w określonych momentach. Hibernate domyśle dostarcza kilka adnotacji, które umożliwiają zaimplementowanie metod callback’owych. Ich wywołanie jest zależne od adnotacji, wywołują się zależne od adnotacji i tyczy się określonego etapu cyklu życia Hibernate:

    • @PostLoad – obiekt został wczytany;
    • @PostPersist – obiekt został zapisany;
    • @PostRemove – obiekt został usunięty;
    • @PostUpdate – obiekt został zmodyfikowany;
    • @PrePersist – przed zapisaniem obiektu;
    • @PreRemove – przed usunięciem obiektu;
    • @PreUpdate – przed modyfikacją obiektu.

Implementacja

Metody callback umieszcza się w encjach JPA. Odpowiednią dobraną adnotacje umieszcza się nad metodą, która ma się wykonać. Np. sposób na logowanie informacji o udanym zapisie elementu do bazy danych.

@PostPersist
public void log() {
    LOGGER.info("new object was saved to the database");
}

Przykład wykorzystania

Dane takie jak wiek danej osoby umieszcza się w bazie danych w postaci daty urodzenia, aby uniknąć zdezaktualizowania tej informacji po roku. Następnie na podstawie bieżącego roku wylicza się aktualny wiek osoby.
Tutaj świetnym rozwiązaniem jest wykorzystanie callbacku, który uruchomi się tuż po wczytaniu obiektu. W encji JPA z wykorzystaniem @PostLoad dokona się operacja obliczenia wieku.

@Entity
@Table(name = "people")
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    @Column(name = "birth_date")
    private LocalDate birthDate;

    @Transient
    private long age;

    @PostLoad
    public void calculateAge() {
        age = ChronoUnit.YEARS.between(prodYear, LocalDate.now());
    }
	
    // geters + setters
}

Nad polem age zastosowałem adnotacje @Transient, która nie pozwala na zapisanie tego pola do tabeli. Natomiast na potrzeby dalszego korzystania przyda się ona jako pole w klasie do wykorzystania w kodzie.

Napisane przez Przemysław Bykowski

Aktywny programista i energiczny trener. Specjalizuje się w Spring Boot i uczę go w ramach AkademiaSpring.pl. Po godzinach udzielam się na YouTubach. Więcej o mnie.

Dodaj komentarz

Spring Boot

Spring Boot #26 – Testy dla zwracanych obiektów z API

Spring Boot

Spring Boot #27 – Przetwarzanie danych z usługi REST bez modelu w kodzie