Jeśli korzystamy z Java Persistence API to możemy zastosować dwie bardzo przydatne adnotacje: @PrePersist i @PreUpdate. Załóżmy, że w każdej klasie chcemy mieć dane o tym kto i kiedy utworzył dany rekord oraz kto i kiedy go ostatnio modyfikował. Ponieważ wszystkie encje mają mieć taką funkcjonalność, logikę i zmienne możemy przenieść do klasy abstrakcyjnej, którą będą rozszerzały wszystkie klasy odwzorowujące:
Metody oznaczone adnotacjami są wywoływane tuż przed zapisem obiektu w bazie danych, pozwalając na dodanie informacji o tym kto i kiedy modyfikował rekord.
import java.util.Date;
import javax.persistence.*;
@MappedSuperclass
public abstract class BaseEntity {
private String createdBy;
private Date createdOn;
private String modifiedBy;
private Date modifiedOn;
@Column(name="created_by")
public String getCreatedBy() {
return createdBy;
}
@Column(name="created_on")
@Temporal(TemporalType.TIMESTAMP)
public Date getCreatedOn() {
return createdOn;
}
@Column(name="modified_by")
public String getModifiedBy() {
return modifiedBy;
}
@Column(name="modified_on")
@Temporal(TemporalType.TIMESTAMP)
public Date getModifiedOn() {
return modifiedOn;
}
// tutaj powinny byc settery dla zmiennych
@PrePersist
public void prePersist() {
User user = ApplicationUtils.getLoggedUser();
setCreatedBy(user.getName());
setCreatedOn(new Date());
}
@PreUpdate
public void preUpdate() {
User user = ApplicationUtils.getLoggedUser();
setModifiedBy(user.getName());
setModifiedOn(new Date());
}
}
Wszystkie adnotacje o zbliżonym działaniu znajdujące się w JPA API to PostLoad, PostPersist, PostRemove, PostUpdate, PrePersist, PreRemove i PreUpdate. Dzięki nim możemy być informowani o wszystkich operacjach zapisu/odczytu/usuwania odbywających się na obiektach z bazy danych. Może to być przydatne, gdy przykładowo takie informacje chcemy zapisywać w pliku logowania.
Brak komentarzy:
Prześlij komentarz