10 maja 2009

Java Persistence API i prosty audyt

Niedawno po raz pierwszy zetknąłem się z zagadnieniem audytu zmian w bazie danych dokonywanych przez użytkowników aplikacji. Chwila googlania i mamy kilka rozwiązań, jedno z nich to ciekawy artykuł na JavaLobby: "Using a Hibernate Interceptor To Set Audit Trail Properties". Jednak istnieje też prostsze rozwiązanie, które chce tutaj przedstawić.

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:


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());
}

}

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.

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