更多SpringDataJPA注解请参照上篇文章:
SpringDataJPA使用的查询关键字和常用注解详细
这几个注解的意思非常好理解:

但是只加这几个注解的时候@CreatedDate和@LastModifiedDate是可以生效的,@CreatedBy 和@LastModifiedBy需要我们自己去实现。我们使用SpringBoot集成SpringDataJPA时的实现方式如下:
首先,需要在Application启动类上使用@EnableJpaAuditing开启审计:
package com.xtoad.ecms.baseinfo;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.data.jpa.repository.config.EnableJpaAuditing;import javax.persistence.EntityManager;/ 启动类 @author xtoad @date 2020/05/29 /@SpringBootApplication(scanBasePackages = {"com.xtoad.ecms"})@EnableJpaAuditing // 开启审计public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
然后,我们需要实现AuditorAware接口来返回当前用户信息:
package com.xtoad.ecms.common.web.config;import com.xtoad.ecms.common.web.UserContext;import org.springframework.context.annotation.Configuration;import org.springframework.data.domain.AuditorAware;import org.springframework.util.StringUtils;import java.util.Optional;/ 审计信息配置类 @author xtoad @date 2021/02/27 /@Configurationpublic class AuditorConfig implements AuditorAware<String> { / Returns the current auditor of the application. @return the current auditor / @Override public Optional<String> getCurrentAuditor() { // 这里的实现根据你自己的实际项目,返回当前登陆人的id或者名字即可 return StringUtils.isEmpty(UserContext.getUserName()) ? Optional.of("anonymous") : Optional.of(UserContext.getUserName()); }}
最后,还需要我们在实体类上添加@EntityListeners(AuditingEntityListener.class),进行实体监听:
package com.xtoad.ecms.baseinfo.model;import com.xtoad.ecms.common.web.base.BaseModel;import org.hibernate.annotations.Table;import org.springframework.data.jpa.domain.support.AuditingEntityListener;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.EntityListeners;/ 用户实体类 @author xtoad @date 2020/05/29 /@Entity@Table(appliesTo = "user", comment = "用户表")@EntityListeners(AuditingEntityListener.class) // 添加实体监听注解public class User extends BaseModel { private static final long serialVersionUID = -1616905035103332302L; / 姓名 / @Column(nullable = true, length = 100, columnDefinition = "VARCHAR(100) COMMENT '姓名'") private String name; / 登录名 / @Column(nullable = false, unique = true, length = 50, columnDefinition = "VARCHAR(50) COMMENT '登录名'") private String loginNo; /////// 其他字段和方法这里忽略了,完整代码请去gitee下载}
我这里的@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy字段是在BaseModel中定义的,代码如下:
package com.xtoad.ecms.common.web.base;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 javax.persistence.Column;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.MappedSuperclass;import javax.persistence.Temporal;import javax.persistence.TemporalType;import java.io.Serializable;import java.util.Date;import static javax.persistence.GenerationType.IDENTITY;/ 基础实体类 @author xtoad @date 2020/05/29 /@MappedSuperclasspublic class BaseModel implements Serializable { / ID / @Id @GeneratedValue(strategy = IDENTITY) private Integer id; / 记录创建时间 / @Temporal(TemporalType.TIMESTAMP) @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间'") private Date createTime; / 记录创建用户 / @Column(nullable = false, length = 100, columnDefinition = "varchar(100) COMMENT '记录创建人'") @CreatedBy private String createUser; / 记录最后修改时间 / @Temporal(TemporalType.TIMESTAMP) @LastModifiedDate @Column(nullable = false, insertable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录最后修改时间'") private Date lastUpdateTime; / 记录最后修改用户 / @Column(nullable = false, length = 100, columnDefinition = "varchar(100) COMMENT '记录最后修改人'") @LastModifiedBy private String lastUpdateUser; ////////////// 这里忽略的其他方法}
全部搞定,我们可以来测试一下看看:
本文源码地址:https://gitee.com/xtoad/ecms-java.git