欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

注解说明

程序员文章站 2022-04-23 16:30:32
...
@CreateBy与@LastModifiedBy需要配合实现AuditorAware实现类使用----Spring data jpa

​ 举例子:

需求:希望在insert用户时候,自动把创建人、创建时间添加上存入数据库。
希望在update的时候,自动把最后更信人、最后更新时间加上存入数据库。。

我这里有一个用户类,是这样子写的。

package com.emmmya.harin.modules.rt.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.emmmya.harin.base.BaseEntity;
import lombok.Data;

import javax.persistence.*;
import java.util.Set;


@Data		//lombok---自动生成set与get方法
@Entity		//jpa---标识这个与数据映射
@TableName("h_user")	//mybatis----映射的表,我这里继承了mybatis-puls和spring data jpa两个框架
@Table(name = "h_user")	//jpa----映射的表 
public class User extends BaseEntity {

    @Column(name = "user_name", unique = true, nullable = false)
    private String username;

    @Column(name = "password", nullable = false)
    private String password;

    /**
     * 用户对应的角色集合
     */
    @Transient
    @TableField(exist = false)
    private Set<Role> roles;
}

​ 你们会发现,这里抽出了一个基础类BaseEnrity:

package com.emmmya.harin.base;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.emmmya.harin.common.constant.DataStatusConstant;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
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 org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

/**
 * @description:
 * @author: [email protected]
 * @createDate: 2020-05-12
 * @version: 1.0
 */
@Data			
@MappedSuperclass		//标识为的父类
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
public class BaseEntity  implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    @ApiModelProperty(value = "唯一标识")
    private Integer id;

    //创建人
    @Column(name="create_by")
    @CreatedBy
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建人")
    private String createBy;

    //创建时间
    @CreatedDate
    @Column(name="create_time")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    //在执行insert语句时候插入
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间")
    private Date createTime;

    //更新人
    @Column(name="update_by")
    @TableField(fill = FieldFill.UPDATE)
    //最后修改人
    @LastModifiedBy
    private String updateBy;

    //更新时间
    @Column(name="update_time")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.UPDATE)
    //最后一次修改时间
    @LastModifiedDate
    @ApiModelProperty(value = "更新时间")
    private Date updateTime;

    @Column(name="del_flag")
    private Integer delFlag = DataStatusConstant.NORMAL_STATUS;
}

这里仔细查看你会发现,@TableField(fill = FieldFill.INSERT)、@TableField(fill = FieldFill.UPDATE),这里简单说明一下。看fill的取值,就可以看出,被该注解修饰的属性,在执行INSERT或者UPDATE语句的时候才会操作被修饰的属性映射的字段。

还有@CreatedDate、@LastModifiedDate,稍微英文好一丢丢的都会知道。@CreateDate在执行INSERT语句的时候,会把当前时间自动赋值到修饰属性插入。@LastModifiedDate在最后一个修改数据的时候,会把当前时间自动赋值到修饰的属性更新。

回到重点,@CreateBy、@UpdateBy:

其实看到上面的@CreatedDate、@LastModifiedDate你就应该想到@CreateBy、@UpdateBy的作用,其实就是自动赋值创建人和更新人嘛,不难理解的。

但是,有个大大的疑惑,那他怎么知道是谁执行了INSERT?是谁执行了UPDAPE语句呢?

这个时候,就要审计功能了。

package com.emmmya.harin.config.jpa;

import com.emmmya.harin.config.security.jwt.JwtConfig;
import com.emmmya.harin.modules.rt.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
//import org.springframework.security.core.context.SecurityContextHolder;
//import org.springframework.security.core.userdetails.UserDetails;

import java.util.Optional;

/**
 * 审计记录创建或修改用户
 * @author Exrickx
 */
@Configuration
@Slf4j
public class UserAuditor implements AuditorAware<String> {
    @Autowired
    JwtConfig jwtConfig;
    
    @Override
    public Optional<String> getCurrentAuditor() {

        //UserDetails user;
        try {
            Subject subject = SecurityUtils.getSubject();
            String token = (String) subject.getPrincipal();
            String username = jwtConfig.getUsernameFromToken(token);
            return Optional.ofNullable(username);
        }catch (Exception e){
            return Optional.empty();
        }
    }
}

这个类也不复杂,一看就懂。就是配置类,实现AuditorAware接口,后面接的泛型是@CreateBy、@UpdateBy修饰的属性类型。这里当然就用了String了。当然,我这里用的是shiro+jwt作为安全框架,所以我这里获取token并解析出来就可以拿到当前用户是谁了。