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.