当前位置: 首页 > news >正文

使用 Spring Boot 设置 Hibernate Envers

Hibernate Envers是一个实现持久实体的审核和版本控制的模块。审计和版本控制是构建生产级Spring 启动微服务的关键组件。Hibernate Envers与Spring Boot无缝集成以实现相同的目标。

在这篇文章中,我们将在我们的Spring Boot Starter应用程序中集成Hibernate Envers。

数据库审核对于合规性非常重要。此外,很多时候,必须分析生产问题。对于这样的分析,审计数据非常有用。

Hibernate Envers POM Dependency

将 Hibernate Envers 与 Spring Boot 一起使用的第一步是将依赖项包含在 POM 文件中。

<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-envers</artifactId>
			<version>5.3.1.Final</version>
</dependency>

为休眠实体启用审核

下一步是简单地为所需实体启用审核。这可以通过使用@Audited注释轻松完成。

@Entity
@Table(name = "vehicle")
@Audited
public class Vehicle {

    @Id
    private UUID id;

    private String vehicleIdentityNumber;

    private String make;

    private String model;

    private String status;

    public Vehicle() {
    }

    public UUID getId() {
        return id;
    }

    public void setId(UUID id) {
        this.id = id;
    }

    public String getVehicleIdentityNumber() {
        return vehicleIdentityNumber;
    }

    public void setVehicleIdentityNumber(String vehicleIdentityNumber) {
        this.vehicleIdentityNumber = vehicleIdentityNumber;
    }

    public String getMake() {
        return make;
    }

    public void setMake(String make) {
        this.make = make;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return "Vehicle{" +
                "id=" + id +
                ", vehicleIdentityNumber='" + vehicleIdentityNumber + '\'' +
                ", make='" + make + '\'' +
                ", model='" + model + '\'' +
                ", status='" + status + '\'' +
                '}';
    }
}

只需对实体类进行注释,Envers Hibernate就会为审计注册此类类。换句话说,这意味着除了主表之外,还将为此类实体创建审计表。

但是,要创建实际表,最直接的方法是使用休眠设置。这是通过使用hibernate.hbm2ddl.auto选项并将其设置为创建

此设置在应用程序属性文件中完成。

spring.datasource.url=jdbc:h2:mem:mytestdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create

请注意,休眠自动创建选项对于生产不安全。

休眠者在行动

我们可以通过启动 Spring Boot 应用程序来查看休眠审核日志记录的运行情况。应用程序启动后,我们可以访问h2控制台

这到底是怎么回事呢?

如您所见,我们有预期的车辆表。除此之外,我们还有一个名为VEHICLE_AUD的新表。审核表包含原始表中的所有字段。

但是,还添加了两个新字段。首先是 REVTYPE 字段。其中包含“0”表示添加,“1”表示更新,“2”表示删除。另一个字段是 REV 字段。

生成另一个表。它被称为REVINFO。它包含两个字段REVREVTSTMPVEHICLE_AUD中的 REV字段基本上是REVINFO表中REV字段的外键。REVINFO表跟踪每个事务。

休眠者在行动

为了测试Hibernate Envers和审计日志记录,我们可以使用我们的载具端点触发一些事务。

当我们使用 POST 操作之类的操作创建新记录,然后使用 PUT 操作对其进行更新时,我们会在 VEHICLE_AUD 表中得到两条记录。

如您所见,ID 是c7a2ac1750fd4e12877efc76b3743646。

有两条记录具有此 ID。一个的 REVTYPE 为 0(创建),而另一个的 REVTYPE 为 1(更新)。

REVINFO表跟踪所有修订。如果您仔细观察,VEHICLE_AUD表中的REV字段是REVINFO表中REV字段的外键。

结论

Hibernate Envers是一个非常强大的解决方案,可以满足Spring应用程序中的审计日志记录需求。

它也与Spring Boot无缝契合。这允许为Spring 引导微服务启用休眠审核日志记录。只需使用注释并将依赖项包含在 POM 文件中,即可轻松设置它。

这篇文章的代码现在可以在Github上找到。

相关文章:

  • 【数据结构】带头节点双向循环链表
  • 原来 GitHub 不仅能学代码,还有这些东西
  • 【动手学深度学习】softmax回归的从零开始实现(PyTorch版本)(含源代码)
  • 为了摸鱼,我开发了一个工具网站
  • Qt编写ERP库存库房发货电子看板
  • 「PAT乙级真题解析」Basic Level 1086 就不告诉你 (问题分析+完整步骤+伪代码描述+提交通过代码)
  • Python函数详解(三)——函数的参数传递进阶
  • 渗透测试CTF-图片隐写的详细教程2(干货)
  • Python3,os模块还可以这样玩,自动删除磁盘文件,非必要切勿操作。
  • 视频分析:走路看手机行为
  • 国内家具行业数据浅析
  • 聚观早报 | 推特临时培训员工应对世界杯;世界杯足球内置传感器
  • Spring Boot——yml和properties详解
  • 【总结】Idea 编译maven项目报错NoSuchMethodError DefaultModelValidator
  • C\C++刷题ADY3
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 《深入 React 技术栈》
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Consul Config 使用Git做版本控制的实现
  • create-react-app项目添加less配置
  • express如何解决request entity too large问题
  • JavaScript 一些 DOM 的知识点
  • mysql外键的使用
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • node-glob通配符
  • PAT A1050
  • Service Worker
  • Terraform入门 - 3. 变更基础设施
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 关于List、List?、ListObject的区别
  • 基于axios的vue插件,让http请求更简单
  • 七牛云假注销小指南
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • python最赚钱的4个方向,你最心动的是哪个?
  • 关于Android全面屏虚拟导航栏的适配总结
  • #预处理和函数的对比以及条件编译
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (2022 CVPR) Unbiased Teacher v2
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (七)Knockout 创建自定义绑定
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (数据结构)顺序表的定义
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)基于IDEA的JAVA基础12
  • (转)h264中avc和flv数据的解析
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET框架
  • @ResponseBody
  • [ActionScript][AS3]小小笔记
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [C++] sqlite3_get_table 的使用