注解说明
程序员文章站
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并解析出来就可以拿到当前用户是谁了。