#spring-boot #spring-data-jpa
Вопрос:
Если нам нужно добавить creation
и modification time
, а также who created
и updated
нашу сущность в наши сущности, нам не нужно использовать Spring Data JPA. Мы можем задать значения полей этих полей, создав методы обратного вызова, которые привязаны к событиям жизненного цикла сущности.
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import javax.persistence.Column;
import javax.persistence.MappedSuperClass
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import java.time.ZonedDateTime;
@MappedSuperClass
public abstract class BaseEntity {
@Column(name = "created_by_user", nullable = false)
@CreatedBy
private String createdByUser;
@Column(name = "modified_by_user", nullable = false)
@LastModifiedBy
private String modifiedByUser;
@Column(name = "creation_time", nullable = false)
@Type(type = "org.jadira.usertype.dateandtime.threeten.PersistentZonedDateTime")
private ZonedDateTime creationTime;
@Column(name = "modification_time")
@Type(type = "org.jadira.usertype.dateandtime.threeten.PersistentZonedDateTime")
private ZonedDateTime modificationTime;
@PrePersist
public void prePersist() {
ZonedDateTime now = ZonedDateTime.now();
this.creationTime = now;
this.modificationTime = now;
String createdByUser = getUsernameOfAuthenticatedUser();
this.createdByUser = createdByUser;
this.modifiedByUser = createdByUser;
}
@PreUpdate
public void preUpdate() {
this.modificationTime = ZonedDateTime.now();
String modifiedByUser = getUsernameOfAuthenticatedUser();
this.modifiedByUser = modifiedByUser;
}
private String getUsernameOfAuthenticatedUser() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || !authentication.isAuthenticated()) {
return null;
}
return ((User) authentication.getPrincipal()).getUsername();
}
}
Даже несмотря на то, что этот метод немного проще и проще, чем использование auditing infrastructure of Spring Data JPA
.
Тогда почему мы используем auditing infrastructure of Spring Data JPA
Зачем использовать AuditorAware
вместо этого напрямую.