数据库公共字段
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@LastModifiedByprivate String updateName;/*** 修改时间*/@JSONField(format = "yyyy-MM-dd HH:mm:ss")@LastModifiedDateprivate 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实现中的逻辑。