业务系统中每张表基本都存在创建时间,更新时间,创建人,修改人,并且方便我们记录操作日志。但是每个实体类上创建相同的实体类非常麻烦。
@CreatedDate
创建时间@LastModifiedDate
最后一次修改时间@CreatedBy
创建人@LastModifiedBy
最后一次修改人
提取公用属性自动填写。再也不用操心操作记录和时间问题。
创建人如何实现,spring data 提供了AuditorAware
接口告诉JPA当前的用户是谁
本人采用了继承公用实体类解决的方案
package com.app.security.entity;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;
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.*;
import java.io.Serializable;
import java.util.Date;
@Getter
@Setter
@MappedSuperclass //表明这是父类,可以将属性映射到子类中使用JPA生成表
@DynamicUpdate //动态赋值
@DynamicInsert //动态插入
public abstract class BaseEntity implements Serializable {
@JSONField(ordinal=1)
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(columnDefinition="int(30)")
protected Long id; //自增主键
@JSONField(ordinal=2,format="yyyy-MM-dd HH:mm:ss")
@CreatedDate
@OrderBy("DESC")
@Column(columnDefinition="DATETIME")
@JsonFormat
protected Date createTime; //创建时间
// @JSONField(ordinal=2,format="yyyy-MM-dd HH:mm:ss")
@LastModifiedDate
@Column(columnDefinition="DATETIME")
@JsonFormat
@OrderBy("DESC")
protected Date modifyTime; //创建时间
@JSONField(ordinal=3,format="yyyy-MM-dd HH:mm:ss")
@JsonFormat
@Column(columnDefinition="DATETIME")
protected Date destroyTime; //销毁时间
@JSONField(ordinal=4)
@Version @Column(nullable=false,columnDefinition="int(20)")
protected Integer version;
/**
* 创建人
*/
@CreatedBy
@ManyToOne(fetch=FetchType.LAZY)
@NotFound(action= NotFoundAction.IGNORE)
@JoinColumn(foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
@JsonIgnore
private SysUser createBy;
/**
* 修改人
*/
@LastModifiedBy
@ManyToOne(fetch=FetchType.LAZY)
@NotFound(action=NotFoundAction.IGNORE)
@JoinColumn(foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
@JsonIgnore
private SysUser updateBy;
}
创建人和修改人运用到Spring data jpa Auditing
package com.app.security.config;
import com.app.security.config.JwtUtil;
import com.app.security.entity.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.AuditorAware;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.util.Optional;
@Slf4j
@Component
public class AuditorAwareImpl implements AuditorAware<SysUser>, Serializable {
private Optional<SysUser> auditor=Optional.empty();
/**
* @param auditor set操作人
*/
public void setAuditor(SysUser auditor) {
this.auditor = Optional.of(auditor);
}
/**
* JPA指定谁操作
*/
public Optional<SysUser> getCurrentAuditor() {
SysUser user=null;
boolean present = auditor.isPresent();
if(!present) {
try {
//获取当前用户
user = JwtUtil.getUser();
} catch (Exception e) {
log.error("更新&添加--->用户获取失败");
}
if(user!=null)auditor=auditor.of(user);
}
return auditor;
}
}