jpa 公用实体类 包含审计

业务系统中每张表基本都有创建时间、更新时间、创建人、修改人等信息,在每个实体类上创建相同实体类很麻烦。可提取公用属性自动填写,采用继承公用实体类的方案解决,spring data 可提供接口告知 JPA 当前用户。

业务系统中每张表基本都存在创建时间,更新时间,创建人,修改人,并且方便我们记录操作日志。但是每个实体类上创建相同的实体类非常麻烦。

  • @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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值