1. 定义通用实体类,作为基类被其他的实体类继承
主要注解:
@MappedSuperclass //自动生成数据库字段时会被继承
@EntityListeners(AuditingEntityListener.class) //自动更新createTime的关键注解
代码示例:
package cn.jorian.learn.learnspringhibernatecrud.core.base;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import javax.persistence.Version;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.hibernate.annotations.OptimisticLocking;
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 lombok.Data;
/**
*
* description 基础实体类
*
* @author juyan.ye
* @date Jul 2, 2020 : 11:10:50 PM
*
*/
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity implements Serializable {
private static final long serialVersionUID = -6863631445166144741L;
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@Column(name = "create_time")
@CreatedDate
LocalDateTime createTime;
@Column(name = "create_by", length = 50)
@CreatedBy
String createBy;
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@Column(name = "updated_time")
@LastModifiedDate
LocalDateTime updatedTime;
@Column(name = "updated_by", length = 50)
@LastModifiedBy
String updatedBy;
}
2. 定义一个获取用户名的审计类,并添加@Configuration
@Configuration //声明是个配置类,将在容器启动时实例化
代码示例:
package cn.jorian.learn.learnspringhibernatecrud.core.audit;
import java.util.Optional;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import lombok.extern.slf4j.Slf4j;
/**
* @author jorian ye
*/
@Configuration
@Slf4j
public class UserAuditor implements AuditorAware<String> {
/**
* 获取当前创建或修改的用户,大多数情况下就是当前登录用户,根据自己的逻辑去获取
* @return
*/
@Override
public Optional<String> getCurrentAuditor() {
// UserDetails user;
// try {
// user = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
// return Optional.ofNullable(user.getUsername());
// }catch (Exception e){
// return Optional.empty();
// }
return Optional.ofNullable("super-admin");
}
}
3. 在启动类上添加@EnableJpaAuditing注解开启审计功能
@EnableJpaAuditing //此注解用来开启审计功能,核心注解
启动类代码示例:
package cn.jorian.learn.learnspringhibernatecrud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
/**
* @SpringBootApplication
* @EnableJpaRepositories 扫描repository
* @EntityScan 扫描实体类
* @EnableJpaAuditing 开启自动生成时间和创建人等
*
* @author juyan ye
*/
@SpringBootApplication
@EnableJpaRepositories
@EntityScan(basePackages = { "cn.jorian.learn.learnspringhibernatecrud.core" })
@EnableJpaAuditing
public class LearnSpringHibernateCrudApplication {
public static void main(String[] args) {
SpringApplication.run(LearnSpringHibernateCrudApplication.class, args);
}
}