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

利用SpringDataJPA开启审计功能可以方便地对每次数据操作进行记录,包括操作人、操作时间等信息。这样做有利于数据追溯和安全性控制。下面是实现该功能的步骤:

  1. 添加必要的依赖

在项目的pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  1. 创建审计类

创建一个名为AuditConfig的类,并把它设置为Spring组件,该类实现了Spring Data JPA提供的JpaAuditingHandler接口。JpaAuditingHandler会在实体保存到数据库时使用Spring Security提供的Authentication获取当前用户信息,然后将其设置到实体对应的审计字段中。

@Configuration
@EnableJpaAuditing
public class AuditConfig implements AuditorAware<String>, JpaAuditingHandler {
    @Override
    public Optional<String> getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

        if (authentication == null || !authentication.isAuthenticated()) {
            return Optional.of("system");
        }

        return Optional.of(authentication.getName());
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        super.setBeanFactory(beanFactory);
    }
}

其中,getCurrentAuditor()方法用来获取当前用户信息,如果获取不到就返回"system",该方法返回值会由JpaAuditingHandler设置到实体的审计字段中。

  1. 创建实体类

在数据实体类中添加审计字段,如createdBy、createdAt、lastModifiedBy、lastModifiedDate。

@Entity
@EntityListeners(AuditingEntityListener.class)
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    private Double price;

    @CreatedBy
    private String createdBy;

    @CreatedDate
    private Date createdAt;

    @LastModifiedBy
    private String lastModifiedBy;

    @LastModifiedDate
    private Date lastModifiedDate;
}
  1. 集成配置

在应用程序启动入口处添加@EnableJpaAuditing注释,以启用审计功能。

@SpringBootApplication
@EnableJpaAuditing
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
 }
  1. 测试

测试时,在JPA Repository中添加实体数据,可以看到自动添加了当前用户信息以及时间戳。

@Service
@Transactional
public class ProductService {
    @Autowired
    private ProductRepository productRepository;

    public Product saveProduct(Product product) {
        return productRepository.save(product);
    }

    public Iterable<Product> findAll() {
        return productRepository.findAll();
    }
}

完整示例代码请见:https://github.com/zhancongc/spring-data-jpa-auditing-demo

例如,执行以下代码进行测试:

@Service
public class Demo {
    @Autowired
    private ProductService productService;

    public void execute() {
        Product product = new Product();
        product.setName("iPhone 13");
        product.setPrice(9999.0);

        productService.saveProduct(product);

        Iterable<Product> products = productService.findAll();

        for (Product p : products) {
            System.out.println(p.toString());
        }
    }
}

结果如下:

Product{id=1, name='iPhone 11', price=999.9, createdBy='system', createdAt=Tue Nov 09 10:30:45 CST 2021, lastModifiedBy='system', lastModifiedDate=Tue Nov 09 10:30:45 CST 2021}
Product{id=2, name='iPhone 12', price=1999.9, createdBy='system', createdAt=Tue Nov 09 10:31:18 CST 2021, lastModifiedBy='system', lastModifiedDate=Tue Nov 09 10:31:18 CST 2021}
Product{id=3, name='iPhone 13', price=9999.0, createdBy='system', createdAt=Tue Nov 09 10:31:46 CST 2021, lastModifiedBy='system', lastModifiedDate=Tue Nov 09 10:31:46 CST 2021}

以上就是利用SpringDataJPA开启审计功能、自动保存操作人操作时间的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用SpringDataJPA开启审计功能,自动保存操作人操作时间 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java的Struts框架中Action的编写与拦截器的使用方法

    下面是关于“Java的Struts框架中Action的编写与拦截器的使用方法”的攻略。 Struts框架 Struts是一种流行的MVC(Model-View-Controller)Java Web框架。它允许将应用程序的内容(模型)、用户界面(视图)和应用程序流程(控制器)分开,这样不同的开发人员可以专注于不同的方面。 Action的编写 Action是S…

    Java 2023年5月20日
    00
  • 解析Tomcat的启动脚本–catalina.bat

    下面是对“解析Tomcat的启动脚本–catalina.bat”的完整攻略: 1. 什么是catalina.bat catalina.bat是Tomcat的启动脚本之一,是用于启动Tomcat服务器的批处理文件,位于Tomcat的bin目录下。该脚本通过执行一系列命令和设置环境变量的操作来启动Tomcat服务器。 2. catalina.bat的主要内容 …

    Java 2023年5月19日
    00
  • 什么是对象终结器?

    对象终结器(Finalizer)是.NET框架中用于清理未经处理的对象的机制,确保在对象被销毁之前,能够执行一些特定的清理工作,如释放资源、关闭文件等。本文将对对象终结器的使用进行详细讲解,并提供两个示例说明。 对象终结器的使用 要使用对象终结器,需要定义一个名为Finalize的方法。这个方法的语法如下: ~MyClass() { // 清理代码 } 在这…

    Java 2023年5月11日
    00
  • 利用Java将2019拆分成三个素数平方和的方法实例

    下面是详细的攻略: 1. 前置知识 在理解“将2019拆分成三个素数平方和”的方法之前,需要掌握以下基本知识: 素数:一个大于1的数,如果仅能被1和它本身整除,则称之为素数。例如:2、3、5、7、11、13等。 平方和:多个数平方后的和。 2. 解法概述 根据题目要求,需要将数字2019拆分成三个素数的平方和。由于2019是一个奇数,所以其中至少一个素数必须…

    Java 2023年5月23日
    00
  • spring框架集成flyway项目的详细过程

    下面是“spring框架集成flyway项目的详细过程”的完整攻略。 一、什么是flyway? Flyway是一个开源的数据库迁移工具,可以帮助我们管理数据库版本的升级和降级。Flyway使用简单,不需要依赖任何第三方库,支持多种数据库,包括MySQL、Oracle、PostgreSQL等。 二、在spring框架中集成flyway 1. 添加依赖 在pom…

    Java 2023年5月19日
    00
  • Java之字节码以及优势案例讲解

    Java之字节码以及优势案例讲解 什么是Java字节码? Java字节码是Java源代码编译后得到的二进制字节码文件,其扩展名为.class,使用JVM(Java虚拟机)来运行。相比于源代码,Java字节码更加节省空间,并且可以跨平台运行。 Java字节码可以通过反编译工具获取到其源代码,但是由于编译后的代码进行了优化,所以反编译后的源代码可能不太容易阅读。…

    Java 2023年5月27日
    00
  • 详解Java 中的函数式接口

    详解Java 中的函数式接口 函数式编程作为现代编程语言的一种编程范式,使用的越来越广泛。而Java 8以后,也开始支持函数式编程。函数式编程有一个非常重要的概念——函数式接口。本文将通过以下几个方面详细讲解Java中的函数式接口。 什么是函数式接口? 函数式接口是指仅有一个抽象方法的接口。函数式接口是函数式编程的核心。 Java 的Lambda 表达式、方…

    Java 2023年5月26日
    00
  • java利用mybatis拦截器统计sql执行时间示例

    下面是关于“java利用mybatis拦截器统计sql执行时间示例”的完整攻略。 什么是Mybatis拦截器 Mybatis拦截器是一个可插拔的、基于Java的自定义扩展功能,用于拦截Mybatis框架的功能处理过程,以实现AOP编程的目的,比如可以拦截数据的 CRUD (增删改查) 过程,实现自定义的数据处理和扩展。 mybatis拦截器示例一:实现查询时…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部