spring jpa 审计功能自定义填充字段方式

目录
  • spring jpa 审计功能自定义填充字段
    • 有两种方式
    • 具体步骤
  • 启用Spring Data JPA审计功能
    • JPA Audit 说明
    • 如何使用审计功能
    • 1.编写AuditorAware
    • 2.在实体类中声明@EntityListeners和相应的注解
    • 3.在Application 中启用审计@EnableJpaAuditing

spring jpa 审计功能自定义填充字段

spring data jpa 通过@CreateBy等注解实现了审计功能(在新建或者修改的时候自动填充某些字段) 但是当我们有多个字段需要填充的时候就不满足了 这就需要我们自己实现相关接口来实现自动填充

有两种方式

  • 一种是实现 auditable接口 但是这样会在实体类中莫名增加很多setter getter方法 会对序列化造成干扰 所以不推荐
  • 我推荐的是第二种方法 重写Listener

具体步骤

在configration 类开启审计功能

@SpringBootApplication
@EnableJpaAuditing
public class Config() {
}

实现entity通用继承类 指定自定义的listener

@EntityListeners({CustomAuditingListener.class})
public class Base{
 private Long id;
 private Long creator;
 private String creatorName;
 private Long modifier;
 private String modifierName;
     ... 省略setter getter
}

实现自定义listener 其中有两个核心的接口 @PrePersist 和 @PreUpdate 第一个是在保存的前置方法(新增 和 更新) 第二个是更新的前置方法 通过这两个方法就可以实现自己填充

@Configurable
public class CustomAuditingListener implements ConfigurableObject {
    public AuditListener() {
    }
    @Autowired
    private AuditHandler auditHandler;
    @PrePersist
    private void prePersist(Object obj) {
        auditHandler.prePersist(obj);
    }
    @PreUpdate
    private void preUpdate(Object obj) {
        auditHandler.preUpdate(obj);
    }
}

实现自定义的 AuditHandler

@Component
public class CustomAuditHandler implements AuditHandler {
    @Override
    public void prePersist(Object obj) {
        if (obj instanceof Base) {
            Base ae = (Base) obj;
            if (ae.getId() == null) {
                this.markForCreate(ae);
            }
        }
    }
    @Override
    public void preUpdate(Object obj) {
        if (obj instanceof Base) {
            Base ae = (Base) obj;
            this.markForUpdate(ae);
        }
    }
    public void markForCreate(Base be) {
        ae.setCreator("自己获取的用户id");
        ae.setCreatorName("自己获取的用户名称");
    }
    public void markForUpdate(Base ae) {
        ae.setModifier("自己获取的用户id");
        ae.setModifierName("自己获取的用户名称");
    }
}*/

启用Spring Data JPA审计功能

突然发现 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这样的注解,只会有一个生效,也就是说在一次请求中,只会被调用一次

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解析Spring Data JPA的Audit功能之审计数据库变更

    一.数据库审计 数据库审计是指当数据库有记录变更时,可以记录数据库的变更时间和变更人等,这样以后出问题回溯问责也比较方便.对于审计表记录的变更可以两种方式,一种是建立一张审计表专门用于记录,另一种是在数据库增加字段.本文所讨论的是第二种方案. 那如何在新增.修改.删除的时候同时增加记录呢?如果每张表都单独记录,代码就会显得很冗余.更好的方式应该是做切面或者事件监听,当数据有变更时统一进行记录. 二.Spring Data JPA审计 Spring Data JPA为我们提供了方便的Audit功能

  • 基于Spring Data的AuditorAware审计功能的示例代码

    Spring Data提供支持审计功能:即由谁在什么时候创建或修改实体.Spring Data提供了在实体类的属性上增加@CreatedBy,@LastModifiedBy,@CreatedDate,@LastModifiedDate注解,并配置相应的配置项,即可实现审计功能,有系统自动记录 createdBy CreatedDate lastModifiedBy lastModifiedDate 四个属性的值,下面为具体的配置项. 示例 创建一个实体类 package com.hfcsbc.i

  • spring data jpa使用详解(推荐)

    使用Spring data JPA开发已经有一段时间了,这期间学习了一些东西,也遇到了一些问题,在这里和大家分享一下. 前言: Spring data简介: Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. Spring Data 包含多个子项目: Commons - 提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化 JPA - 简化创建 JPA 数据访问层和跨存储的持久层

  • Spring Data JPA的Audit功能审计数据库的变更

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 数据库审计 数据库审计是指当数据库有记录变更时,可以记录数据库的变更时间和变更人等,这样以后出问题回溯问责也比较方便.对于审计表记录的变更可以两种方式,一种是建立一张审计表专门用于记录,另一种是在数据库增加字段.本文所讨论的是第二种方案. 那如何在新增.修改.删除的时候同时增加记录呢?如果每张表都单独记录,代码就会显得很冗余.更好的方式应该是做切面或者事件监听,当数据有变更时统一进行记录. 2 Spring Dat

  • spring jpa 审计功能自定义填充字段方式

    目录 spring jpa 审计功能自定义填充字段 有两种方式 具体步骤 启用Spring Data JPA审计功能 JPA Audit 说明 如何使用审计功能 1.编写AuditorAware 2.在实体类中声明@EntityListeners和相应的注解 3.在Application 中启用审计@EnableJpaAuditing spring jpa 审计功能自定义填充字段 spring data jpa 通过@CreateBy等注解实现了审计功能(在新建或者修改的时候自动填充某些字段)

  • Spring JPA使用CriteriaBuilder动态构造查询方式

    目录 Spring JPA使用CriteriaBuilder动态构造查询 JPA CriteriaBuilder中一些运算的使用 Spring JPA使用CriteriaBuilder动态构造查询 在使用Spring JPA提供的方法只能进行简单的CRUD,如果遇到复杂的情况就需要我们动态来构建查询条件了.这里我们来看使用CriteriaBuilder如何来构造查询. 核心代码: CriteriaBuilder criteriaBuilder = entityManager.getCriteri

  • Spring Boot 集成 Mybatis Plus 自动填充字段的实例详解

    一般在表设计的时候,都会在表中添加一些系统字段,比如 create_time.update_time等. 阿里巴巴开发手册中也有这样的提示,如果对于这些公共字段可以进行统一处理,不需要每次进行插入或者更新操作的时候 set 一下,就可以提高开发效率,解放双手. 加入依赖 下面就通过 MyBatis Plus 来完成字段自动填充,首先加入 MyBatis Plus 依赖: <dependency>     <groupId>com.baomidou</groupId>  

  • 利用SpringDataJPA开启审计功能,自动保存操作人操作时间

    目录 1 相关注解 实现自动记录上述信息主要有5个注解 2 实现过程 2.1 依赖引用 2.2 实体类标记审计属性 2.3 审计自定义操作 2.4 应用开启审计功能 2.5 实体操作 有些业务数据对数据的创建.最后更新时间以及创建.最后操作人进行记录.如果使用Spring Data Jpa做数据新增或更新,可实现自动保存这些信息而不需要显示设置对应字段的值,可通过以下步骤进行配置. 1 相关注解 实现自动记录上述信息主要有5个注解 @EnableJpaAuditing:审计功能开关 @Creat

  • mybatis自动扫描和自定义类注解方式

    目录 mybatis自动扫描和自定义类注解 Spring mybatis自动扫描dao 解决方案 mybatis自动扫描和自定义类注解 以往都是使用自定义注解实现Dao层mapper.java和mapper.xml文件的装载,今天在搭建MyBatis的过程,使用了MyBatis的自动扫描进行Dao层mapper.java和mapper.xml文件的装载过程中不断报错扫描不到,当时配置文件如下 最后找出原因是因为开启自动扫描的时候不能使用自定义注解类,否则spring默认是使用自定义类的方式进行文

  • Python日志:自定义输出字段 json格式输出方式

    最近有一个需求:将日志以json格式输出, 并且有些字段是logging模块没有的.看了很多源码和资料, 终于搞定, 抽取精华分享出来, 一起成长. import json import logging class JsonFilter(logging.Filter): ip = 'IP' source = 'APP' def filter(self, record): record.ip = self.ip record.username = self.source return True i

  • 详解Spring Boot使用Maven自定义打包方式

    前言:本文将告诉你如何将程序Jar与与依赖Jar及配置文件分离打包,以下列举了两种不同Maven打包方式,其打包效果一致! 一.第一种Maven打包方式,将jar及resources下全部配置文件,拷贝到指定目录: <!--配置项--><properties> <!--自定义配置--> <project.jar.output.directory>E:/IDEAFile/file-copy/target/project</project.jar.outp

  • Spring JPA 增加字段执行异常问题及解决

    目录 Spring JPA 增加字段执行异常 JPA自增字段自动添加报错“error performing isolated work” 正确做法是使用 Spring JPA 增加字段执行异常 用Spring jpa Entity里面增加了几个字段,但启动报错,提示 column Unable to execute schema management to JDBC target: alter table qps_dictionary add column create_by varchar(1

  • Spring AOP统一功能处理示例代码

    目录 1. 什么是Spring AOP? 2. 为什要用 AOP? 3. Spring AOP 应该怎么学习呢? 3.1AOP组成 3.1.1 切面(Aspect) 3.1.2 连接点(Join Point) 3.1.3 切点(Pointcut) 3.1.4 通知(Advice) 3.2 Spring AOP实现 3.2.1 添加 AOP 框架支持 3.2.2 定义切面和切点. 3.2.3 定义相关通知 3.3 Spring AOP 实现原理 3.3.1 动态代理 3.3.2 JDK和CGLIB

随机推荐