Почему нам нужно использовать spring data jpa вместо методов обратного вызова, которые привязаны к событиям жизненного цикла сущности

#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 вместо этого напрямую.