关于自动填充或更新实体中的 CreateDate、CreatedBy 等在之前有一篇 jeecg 默认为空的字段值是如何被填充的? 有提到通过拦截器的方式实现,但是今天带大家了解一下如果使用 JPA 的审计功能是如何简单实现该操作的。

JPA Audit 说明

在 Spring JPA 中,支持在字段或者方法上进行注解 @CreateDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy

@CreateDate
表示该字段为创建时间时间字段,在这个实体被 insert 的时候,会设置默认值

@CreatedBy
表示该字段为创建人,在这个实体被insert的时候,会设置值。

@LastModifiedDate、@LastModifiedBy同理

附一张项目中的使用图:

如何使用审计?

难道就像上方图片显示的,只需要加上注解就可以了吗?

显然是否定的。

  1. 实体类上添加 @EntityListeners(AuditingEntityListener.class)

  2. 在需要的字段上加上 @CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 等注解。

  3. 在Xxx Application 启动类上添加 @EnableJpaAuditing

  4. 实现 AuditorAware 接口来返回你需要插入的值。重点!

如下是一个基类的代码,实现了 1、2 步:

@Data@MappedSuperclass@EntityListeners(AuditingEntityListener.class)public abstract class BaseEntity implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id    @ApiModelProperty(value = "唯一标识")    private String id;

    @CreatedBy    private String createBy;

    @CreatedDate    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")    @ApiModelProperty(value = "创建时间")    private Date createTime;

    @ApiModelProperty(value = "更新者")    @LastModifiedBy    private String updateBy;

    @LastModifiedDate    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")    @ApiModelProperty(value = "更新时间")    private Date updateTime;

}

第3步,启动类上增加注释:

@SpringBootApplication@EnableJpaAuditingpublic class TmaxApplication {

    public static void main(String[] args) {        SpringApplication.run(TmaxApplication.class, args);    }

   /**     * 测试中如果无法自动识别,可能是包路径的问题,采用手动声明bean的方式     * @return     */    @Bean    public UserAuditor setUserAuditorAware(){        return new UserAuditor();    }}

经过测试如果你的实体类上面的多个字段使用了 @CreatedBy 这样的注解,只会有一个生效,也就是说在一次请求中,只会被调用一次

来看第4步,也是最重要的一步:

@Configuration@Slf4jpublic class UserAuditor implements AuditorAware<String> {

    /**     * 获取当前创建或修改的用户     * @return     */    @Override    public Optional<String> getCurrentAuditor() {

        UserDetails user;        try {            user = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();            return Optional.ofNullable(user.getUsername());        }catch (Exception e){            return Optional.empty();        }    }}

关于方法 getCurrentAuditor 中获取用户名的操作可根据自己实际情况书写,比如上方我用到的是 Spring Secirity 的一种写法。

如果文章有错的地方欢迎指正,大家互相留言交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:niceyoo

转载于:https://www.cnblogs.com/niceyoo/p/10908647.html

JPA EnableJpaAuditing 审计功能相关推荐

  1. Spring Data Jpa 审计功能

    Spring Data Jpa的审计功能需要引入下述依赖 <dependency><groupId>org.springframework.boot</groupId&g ...

  2. SQL Server审计功能入门:CDC(Change Data Capture)

    原文:SQL Server审计功能入门:CDC(Change Data Capture) 介绍 SQL Server 2008引入了CDC(Change Data Capture),它能记录: 1. ...

  3. mysql 操作审计_利用mysql的audit审计功能记录用户操作信息

    mysql数据库中我们如果想记录用户的操作信息,可以通过audit审计功能来来实现.该功能是被自动触发的,在文件plugin_audit.h中可以看到比较详细的定义.在audit插件中,可控制的变量包 ...

  4. mysql审计权限_MySQL对普通用户(没有super)开启审计功能

    最近有发现有坏蛋delete 了数据,找不到是哪个user 哪个host,发现mysql 是可以对没有super 权限的用户开启审计功能,oracle早就 最近有发现有坏蛋delete 了数据,找不到 ...

  5. mysql基于init-connect+binlog完成审计功能

    目前社区版本的mysql的审计功能还是比较弱的,基于插件的审计目前存在于Mysql的企业版.Percona和MariaDB上,但是mysql社区版本有提供init-connect选项,基于此我们可以用 ...

  6. mysql5.7审计功能开启_MySQL5.7审计功能windows系统

    MySQL5.7审计功能windows系统 MySQL的审计功能,主要可以记录下对数据库的所有操作,包括登录.连接.对表的增删改查等,便于责任追溯,问题查找,当然一定方面也会影响数据库效率.根据 My ...

  7. mysql创建只读权限用户_新品速递 | Harbor 修复权限提升漏洞,MySQL Plus 支持密码强度校验以及审计功能...

    为了更好的服务 QingCloud 用户,我们推出了『产品速递』栏目,帮助大家梳理青小云家最近上线的新功能和新产品,供大家从中快速选择,得以应用. 1 Harbor On QingCloud 升级至 ...

  8. mysql审计 社区版有吗_mysql 5.6 社区版上审计功能,不扯皮

    官网 https://mariadb.com/kb/en/mariadb/about-the-mariadb-audit-plugin/ 一.环境说明 MySQL 5.6.25 社区版 Mariadb ...

  9. mssql 数据库审计账户_SQLServer数据库审计功能入门之SQL Server审核 (SQL Server Audit)...

    本文主要向大家介绍了SQLServer数据库审计功能入门之SQL Server审核,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. 介绍 Audit是SQL Server ...

最新文章

  1. 4高并发服务器:UDP局域网服务器(组播)
  2. c语言 4则运算符,C语言学习之路之四-----------C语言的运算符与表达式
  3. linux iptables_linux 开启独立iptables日志
  4. jquery广告轮播插件
  5. 【sklearn第九讲】支持向量机之分类篇
  6. 项目日报模板_中山首个地下综合管廊项目取得重大进展
  7. 共模信号和差模信号的区别和抑制
  8. Xcode 真机调试 ineligible Devices的解决方法
  9. java Thread的start和run方法的区别
  10. redis常用命令总结(慎入)
  11. F - Nastya and Door
  12. Haar小波提升算法
  13. 记录一个网易云IM和直播功能中,服务器API的Java调用代码
  14. 【综合题】农民挤奶问题
  15. 云队友丨稻盛和夫:“愚直”的人,终成大器
  16. 手动修改设置VMware的IP地址
  17. 生命周期onLoad和onShow的区别
  18. KVC和KVO简单的区别
  19. 二维码的识别过程以及柱体二维码的实际应用情况调研报告
  20. JavaScript实现懒加载

热门文章

  1. 在LNMP下用nginx 1.4.7配置nagios监控
  2. Ubuntu开启远程连接
  3. 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境...
  4. #np.random.normal,产生制定分布的数集(默认是标准正态分布)
  5. Codeforces Round #309 (Div. 2) C
  6. spring配置datasource三种方式
  7. linux kernel内存映射实例分析
  8. C#基础系列问题一break、continue、return、goto语句
  9. 函数组:BUSG(SAP 商业图形库)
  10. 划分vlan,制作trunk口。使同一vlan能互相通讯