在Spring Data JPA中,Auditing(审计)是一种非常实用的功能,它可以帮助我们自动记录实体对象的创建时间和修改时间,以及创建人和最后修改人的信息。而@MappedSuperclass
注解则用于定义一个基类,这个基类包含了一些通用的属性和行为,可以被多个实体类继承。
下面我将详细介绍如何结合@MappedSuperclass
和Spring Data JPA的Auditing功能来实现实体的审计功能。
1. 添加依赖
首先确保你的项目中有Spring Data JPA和Spring Boot Starter Web的依赖。如果你使用的是Maven,可以添加以下依赖到pom.xml文件中:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2. 配置Auditing
在Spring Boot应用中,你需要配置一个AuditAware
实现来告诉Spring Data JPA如何获取当前登录用户的信息。
创建一个AuditAwareImpl
类来实现AuditAware
接口:
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
public class AuditAwareImpl implements AuditAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
return Optional.of(((UserDetails) principal).getUsername());
} else if (principal instanceof String) {
return Optional.of((String) principal);
}
return Optional.empty();
}
}
这个实现类会从Spring Security的安全上下文中获取当前登录的用户信息。如果你的应用没有使用Spring Security,可以根据实际情况进行调整。
3. 创建Audit基类
接下来,定义一个AuditBase
类,使用@MappedSuperclass
注解,这样就可以被其他实体类继承。
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import java.time.LocalDateTime;
@MappedSuperclass
public abstract class AuditBase {
@Column(nullable = false, updatable = false)
private LocalDateTime createdDate;
@Column(nullable = false)
private LocalDateTime lastModifiedDate;
@Column(updatable = false)
private String createdBy;
@Column
private String lastModifiedBy;
@PrePersist
protected void onCreate() {
createdDate = LocalDateTime.now();
lastModifiedDate = createdDate;
createdBy = getCurrentAuditor();
lastModifiedBy = createdBy;
}
@PreUpdate
protected void onUpdate() {
lastModifiedDate = LocalDateTime.now();
lastModifiedBy = getCurrentAuditor();
}
// Getter methods for the fields
}
在这个基类中,我们定义了创建时间和最后修改时间的字段,以及创建者和最后修改者的字段。同时,我们还实现了@PrePersist
和@PreUpdate
注解来确保这些字段在实体保存或更新之前能够被正确地设置。
4. 使用Audit基类
现在,你可以让任何需要审计功能的实体类继承AuditBase
类。
例如,创建一个User
实体类:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User extends AuditBase {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and setters
}
5. 启用Auditing
最后,确保你的Application
类中启用了Auditing功能,可以通过@EnableJpaAuditing
注解来实现。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@SpringBootApplication
@EnableJpaAuditing(auditorAwareRef = "auditAwareImpl")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
这里的auditorAwareRef
属性指定了我们之前创建的AuditAwareImpl
实现类。
总结
通过以上步骤,我们已经成功地配置了一个具有审计功能的Spring Data JPA应用程序。每当实体被保存或更新时,Spring Data JPA都会自动填充创建时间和最后修改时间等信息,极大地简化了开发工作。