業務系統中每張表基本都存在創建時間,更新時間,創建人,修改人,並且方便我們記錄操作日誌。但是每個實體類上創建相同的實體類非常麻煩。
@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;
}
}