数据库公共字段
1、多租户 tenantId
2、创建者名字 createName
3、创建者时间 createTime
4、更新者名字 updateName
5、更新者时间 updateTime
基础model类
/**
* 基础Model
*/
@Data
@MappedSuperclass
public class BaseModel implements Serializable{
@Id
@GeneratedValue(strategy= GenerationType.AUTO, generator="native")
@GenericGenerator(name="native", strategy="native")
protected Long id;
private String tenantId;
@CreatedBy
@Column(updatable = false)
private String createName;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
@CreatedDate
@Column(updatable = false)
private LocalDateTime;
@CreatedBy
@LastModifiedBy
private String updateName;
/**
* 修改时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
@LastModifiedDate
private LocalDateTimemodifyTime;
}
子类应用
@Entity
@Table(name = "users")
public class UserEntity extends BaseEntity {
private String username;
......
}
AuditingEntityListener
在Spring Data JPA中,AuditingEntityListener是一个用于自动审计(auditing)的实体监听器(EntityListener)。它可以帮助开发者自动跟踪实体的创建、更新和删除等操作,而无需在每个实体类中显式地编写这些逻辑。
要使用AuditingEntityListener,需要确保以下几点:
- 添加依赖:确保项目中包含了Spring Data JPA和Spring Boot的starter依赖(如果使用的是Spring Boot)。
- 开启审计功能:在Spring Boot应用中,可以使用@EnableJpaAuditing注解来开启审计功能。
- 配置审计属性:可以通过auditorAware和dateTimeProvider来配置审计的属性。例如,可能想要记录是哪个用户修改了实体,或者实体的最后修改时间。
- 在实体类上使用注解:使用@EntityListeners(AuditingEntityListener.class)注解在实体类上启用审计监听器。此外,还可以使用@CreatedBy、@CreatedDate、@LastModifiedBy和@LastModifiedDate等注解来指定哪些字段应该用于存储审计信息。
下面是一个简单的例子:
1. 实体类
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
@EntityListeners(AuditingEntityListener.class)
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@CreatedBy
private String createdBy;
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedBy
private String lastModifiedBy;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
// getters and setters...
}
2. 配置类
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
public class AuditConfig {
// 可以实现一个AuditorAware的Bean来提供当前的用户信息
// 例如,在Web应用中,可以从SecurityContextHolder中获取当前的用户名
@Bean
public AuditorAware<String> auditorProvider() {
return () -> Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication())
.map(Authentication::getName);
}
}
AuditorAware
AuditorAware接口用于在审计过程中确定当前用户(即“审计者”或“修改者”)。当使用@CreatedBy和@LastModifiedBy注解时,Spring Data JPA会查找一个实现了AuditorAware接口的bean来填充这些字段的值。
下面是如何实现和配置AuditorAware的一个示例:
- 实现AuditorAware接口
首先,需要实现AuditorAware接口。在这个实现中,需要提供一个方法返回当前审计者的信息。在Web应用中,这通常意味着从Spring Security的SecurityContextHolder中获取当前认证的用户。
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
public class SpringSecurityAuditorAware implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
// 获取当前认证的用户(如果有的话)
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || !authentication.isAuthenticated() || !(authentication.getPrincipal() instanceof String)) {
return Optional.empty();
}
// 假设我们存储的是用户名作为String类型
return Optional.of((String) authentication.getPrincipal());
}
}
- 配置AuditorAware
在Spring Boot应用中,可以使用@EnableJpaAuditing注解来开启JPA审计功能,并通过auditorAwareRef属性指定AuditorAware实现。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@Configuration
@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware")
public class AuditConfig {
@Bean
public SpringSecurityAuditorAware springSecurityAuditorAware() {
return new SpringSecurityAuditorAware();
}
}
在这个配置中,auditorAwareRef属性的值应该是AuditorAware bean的名称(默认是bean的类型名称的首字母小写,但可以通过@Bean注解的name属性来指定一个不同的名称)。
3. 在实体类中使用审计注解
现在,可以在实体类中使用@CreatedBy和@LastModifiedBy注解了。当实体被保存或更新时,Spring Data JPA会自动填充这些字段。
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.LastModifiedBy;
import javax.persistence.Entity;
@Entity
public class MyEntity {
// ... 其他字段 ...
@CreatedBy
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
// ... getters and setters ...
}
请注意,需要确保应用已经配置了Spring Security或其他安全框架,以便能够访问到当前的用户信息。如果没有使用任何安全框架,或者想使用不同的方式来确定审计者,可以根据需要调整AuditorAware实现中的逻辑。