启用 Spring Data JPA 审计功能-阿里云开发者社区

开发者社区> li木水> 正文

启用 Spring Data JPA 审计功能

简介: 突然发现 Spring Data JPA 有这么一个功能,英文是 Auditing JPA Audit 说明 在spring jpa中,支持在字段或者方法上进行注解@CreatedDate、@CreatedBy、 @LastModifiedDate、@LastModifiedBy,从字面意思可以很清楚的了解,这几个注解的用处。
+关注继续查看

突然发现 Spring Data JPA 有这么一个功能,英文是 Auditing

JPA Audit 说明

在spring jpa中,支持在字段或者方法上进行注解@CreatedDate、@CreatedBy、
@LastModifiedDate、@LastModifiedBy,从字面意思可以很清楚的了解,这几个注解的用处。

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

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

@LastModifiedDate、@LastModifiedBy同理。

如何使用审计功能

首先申明实体类,需要在类上加上注解@EntityListeners(AuditingEntityListener.class),其次在application启动类中加上注解EnableJpaAuditing,同时在需要的字段上加上@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy等注解。

这个时候,在jpa.save方法被调用的时候,时间字段会自动设置并插入数据库,但是CreatedBy和LastModifiedBy并没有赋值,因为需要实现AuditorAware接口来返回你需要插入的值。

1.编写AuditorAware

/**
 * 监听
 * @CreatedBy
 * @LastModifiedBy
 * 自动注入用户名
 */
@Configuration
public class UserAuditorAware implements AuditorAware<String> {


    @Override
    public Optional<String> getCurrentAuditor() {
        //TODO: 根据实际情况取真实用户
        return Optional.of("admin");
    }
}

2.在实体类中声明@EntityListeners和相应的注解

考虑到所有实体都需要声明,就写在BaseEntityModel 中

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntityModel  implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -6163675075289529459L;

    @JsonIgnore
    String entityName = this.getClass().getSimpleName();

    @CreatedBy
    String createdBy;

    @LastModifiedBy
    String modifiedBy;
    /**
     * 实体创建时间
     */
    @Temporal(TemporalType.TIMESTAMP)
    @CreatedDate
    protected Date dateCreated = new Date();

    /**
     * 实体修改时间
     */
    @Temporal(TemporalType.TIMESTAMP)
    @LastModifiedDate
    protected Date dateModified = new Date();

     #省略getter setter
}

3.在Application 中启用审计@EnableJpaAuditing

@SpringBootApplication
@EnableJpaAuditing
public class Application {
    
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application .class, args);
    }

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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring-boot+Dubbo应用启停源码分析
你有没有想过一个问题?incubator-dubbo-spring-boot-project中的DubboConsumerDemo应用就一行代码,main方法执行完之后,为什么不会直接退出呢?
2553 0
flex 1119错误 找不到属性 static 解决方法,编译选项中选中 不启用rsl
flex 1119错误 找不到属性 static 解决方法,编译选项中选中 不启用rsl
407 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
8391 0
DataV账号间屏幕拷贝功能指南
账户间的拷屏功能就是这么低调地上线了。虽然操作非常简单,但是会涉及到一个用户识别码的新概念,拷屏过程中也会有一定的规则,所以还是向各位介绍具体操作。
7401 0
Spring MVC 基于阻塞队列 LinkedBlockingQueue 的同步长轮询功能实现
标题 Spring MVC 基于阻塞队列 LinkedBlockingQueue 的同步长轮询功能实现,其实本文介绍的也是生产者消费者的一种实现。生产者不必是一个始终在执行的线程,它可以是一个接口,接受客户端的请求,向队列中插入消息;消费者也不必是一个始终在执行的线程,它同样也可以是一个接口,接受客户端的请求,从队列中取出属于自己的消息;看到很多介绍生产者消息者实现的文章,实现场景都很简单,现实应用往往会比较复杂,有一些附加条件,本例中就需要根据消息中的 familyId 来判断消息是不是下发给自己的。
1128 0
有了智能指环Padrone Ring,挥动手指即可实现鼠标功能
这款智能指环重量只有8克,而且可通过蓝牙连接电脑,不占用USB口。
941 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
12029 0
新功能:日志服务命令行工具ETL发布!
日志服务命令行工具ETL发布,解决数据采集、分析查询、投递归档、外部整合过程中的数据规整痛点,提供实时、可靠、可扩展、可管理的运行模式支持,以及全面简单的ETL规则,并支持丰富的扩展支持。
3079 0
+关注
li木水
专注Java开发,研究方向spring cloud微服务、docker容器、机器学习
24
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载