Spring Data Envers 数据审计实战

随着各行各业信息化发展,决策者们越来越意识到数据版本追踪的重要性,尤其是上市公司,数据对于他们尤为重要。考虑到研发成本,对重要表单数据支持页面级的修改历史查看、对所有业务数据支持DB级的版本查看是一个不错的选择。

对于使用了Spring框架的Java项目而言,Spring Data Envers就是一个非常适合做数据审计的组件。下面我们看看如何在项目中集成Spring Data Envers实现数据审计功能。

1. 加入spring data envers依赖,如果是spring boot/cloud项目版本号无需填写

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-envers</artifactId>
</dependency>

2. 启动类加入@EnableJpaAuditing和@EnableEnversRepositories注解

3. 配置文件application.properties中增加以下配置:

spring.jpa.properties.org.hibernate.envers.audit_strategy=org.hibernate.envers.strategy.internal.ValidityAuditStrategy
spring.jpa.properties.org.hibernate.envers.audit_strategy_validity_store_revend_timestamp=true

配置补充说明:
hibernate提供了两种审计策略,分别是
org.hibernate.envers.strategy.internal.DefaultAuditStrategy
org.hibernate.envers.strategy.internal.ValidityAuditStrategy
如果使用DefaultAuditStrategy,USER_AUD表中不会有REVEND,REVEND_TSTMP两个字段,只会单纯的记录变更与版本
而使用ValidityAuditStrategy,在新增一条变更记录时,会更新上一条变更记录的REVEND,REVEND_TSTMP为当前的版本号以及变更时间
因为ValidityAuditStrategy除了插入新纪录还要更新旧的记录,所以插入速度会慢一点,但是因为提供了额外的信息,对于数据查询,速度则较DefaultAuditStrategy更快一些。

4. 在DB创建审计实体表,默认表名为:revinfo(可以自定义审计实体类修改这个表名)

create table revinfo
(rev int not null primary key,revtstmp bigint
)

5. 在需要数据审计的实体类或字段上加入@Audited(org.hibernate.envers)注解

1)    整个类上加入@Audited注解 (推荐方式),会对类中所有字段进行版本审计:

@Audited
@Entity
@Table(name = "demo")
public class Demo {
...
}

2)    在字段上加入@Audited,仅对加了注解的字段进行版本审计:

@Audited
@Column(name = "name", length = 100, nullable = false)
private String name;

6. Repository中继承RevisionRepository<T(数据实体类型),String(数据ID类型),Long(审计版本号类型)>

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.history.RevisionRepository;public interface DemoRepository extends JpaRepository<Demo, String>, RevisionRepository<Demo, String, Long> {
}

7. 将下列JPA配置修改为update,这样启动项目的时候会自动为加入@Audited的业务表创建审计表(_aud结尾,如:demo表对应的审计表就是demo_aud)

spring.jpa.hibernate.ddl-auto=update

8. 启动项目,使用继承了RevisionRepository的repository对象进行保存数据,然后看看数据库对应的_aud表是否有数据产生,每一次数据变更操作会在这个_aud表生成一条记录。

    public void save(String name) {Demo demo = new Demo();demo.setName(name);demoRepository.save(demo);}

9. Spring Data Envers提供了一些方便操作数据审计记录的方法,可以直接使用:

//根据数据id获取审计集合对象:
Revisions<Long, Demo> revisions = demoRepository.findRevisions(id);
//获取审计对象列表
List<Revision<Long, Demo>> revisionList = revisions.getContent();
//遍历审计列表,可以封装需要的业务对象列表
revisionList.forEach(revision -> {//历史版本的实体对象Demo dm = revision.getEntity();//审计Meta信息revision.getMetadata();//数据操作时间revision.getMetadata().getDelegate()).getTimestamp();//操作类型:修改、插入、删除、未知revision.getMetadata().getRevisionType();
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/670288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式学习笔记(一):基本概念;UML

文章目录 参考面向对象的设计原则创建型模式结构型模式行为型模式 UML视图图&#xff08;Diagram&#xff09;模型元素(Model Element)通用机制类之间的关系关联关系复杂&#xff01;&#xff01;聚合关系组合关系 依赖关系泛化关系接口与实现关系 参考 https://github.com/fa…

2.0 Zookeeper 安装配置

Linux 安装 zookeeper 下载地址为: Apache ZooKeeper。 选择一稳定版本&#xff0c;本教程使用的 release 版本为3.4.14&#xff0c;下载并安装。 打开网址 https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz&#xff0c;看到如下界…

c#cad 创建-圆(二)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 这段代码是一个AutoCAD插件&#xff0c;用于在模型空间中创建一个圆形。 首先&#xff0c;我们需要定义一个命令类CreateCircleCommand&#xff0c;并在命名空间CreateCircleInCad中声明。 在CreateCircleCommand类中&a…

【技能树学习】Git入门——练习题解析

前言 本篇文章给出了Git入门技能树中部分的练习题解析&#xff0c;包括分支管理&#xff0c;Git标签&#xff0c;在Mac和Windows上使用GitVSCode的步骤。强调了git cherry-pick不直接支持从标签中选择提交&#xff0c;git tag -d只能删除本地标签&#xff0c;Mac系统的终端可以…

23、数据结构/查找相关练习20240205

一、请编程实现哈希表的创建存储数组{12,24,234,234,23,234,23},输入key查找的值&#xff0c;实现查找功能。 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> #include<math.h> typedef struct Node {int data;struct n…

flutter使用webview_flutter在安卓和ios上打开网页

webview_flutter仓库地址&#xff1a;webview_flutter | Flutter package github地址&#xff1a;https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter 要打开非https协议的网页&#xff0c;需要在安卓平台上添加权限&#xff1a;andro…

若依整合mybatis-plus

文章目录 1.注释掉原本的MybatisConfig2. 将mybatis的配置文件改为mybatis-plus文件 ##前言 出先下列异常&#xff1a; 请求地址’/prod-api/user’,发生未知异常. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ruoyi.web.mapper.Us…

003集—三调数据库添加三大类字段——arcgis

在国土管理日常统计工作中经常需要用到三大类数据&#xff08;农用地、建设用地、未利用地&#xff09;&#xff0c;而三调数据库中无三大类字段&#xff0c;因此需要手工录入三大类字段&#xff0c;并根据二级地类代码录入相关三大类名称。本代码可一键录入海量三大类名称统计…

数字图像处理(实践篇)四十五 OpenCV-Python 使用ORB算法(包括算法概述)检测图像上的特征点

目录 一 ORB算法 二 涉及的函数 三 实践 ORB: An efficient alternative to SIFT or SURF SIFT 和 SURF 已获得专利,使用需要付费。但是ORB并不需要。ORB 最重要的一点是它来自“

【日常总结】SourceTree 1.5.2.0 更换用户名称和密码

一、场景 二、问题 三、解决方案 > 方案一&#xff1a;删除缓存文件 > 方案二&#xff1a;更新最新版本&#xff0c;可以直接修改密码&#xff08;推荐&#xff09; 方案一&#xff1a;删除缓存文件 Stage 1&#xff1a;设置显示隐藏文件 Stage 2&#xff1a;打开…

070:vue+cesium: 利用canvas设置线性渐变色材质

第070个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置线性渐变色的材质,这里使用canvas的辅助方法。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共104行)专栏目标示例效果 配置方式 1)查看基础…

Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧

技术背景 我们在做Android平台GB28181设备对接模块的时候&#xff0c;遇到这样的技术需求&#xff0c;开发者希望能以后台服务的形式运行程序&#xff0c;国标平台侧没有视频回传请求的时候&#xff0c;仅保持信令链接&#xff0c;有发起视频回传请求或语音广播时&#xff0c;…

数字孪生网络攻防模拟与城市安全演练

在数字化浪潮的推动下&#xff0c;网络攻防模拟和城市安全演练成为维护社会稳定的不可或缺的环节。基于数字孪生技术我们能够在虚拟环境中进行高度真实的网络攻防模拟&#xff0c;为安全专业人员提供实战经验&#xff0c;从而提升应对网络威胁的能力。同时&#xff0c;在城市安…

GEE数据集——全球健康地图项目Global Healthsites Mapping Project

Global Healthsites Mapping Project Healthsites.io和全球健康网站绘图项目的使命是帮助向政府、非政府组织和私营部门提供准确的最新健康设施信息。医疗机构登记簿是一个国家内运作良好的医疗信息系统的基石。准确和最新的数据提供了基础数据&#xff0c;有助于推动服务可用…

5分钟掌握接口自动化测试,4个知识点简单易学!

一. 什么是接口测试 接口测试是一种软件测试方法&#xff0c;用于验证不同软件组件之间的通信接口是否按预期工作。在接口测试中&#xff0c;测试人员会发送请求并检查接收到的响应&#xff0c;以确保接口在不同场景下都能正常工作。 就工具而言&#xff0c;常见的测试工具有…

16-Verilog实现二线制I2C CMOS串行EEPROM的读写操作

Verilog实现二线制I2C CMOS串行EEPROM的读写操作 1&#xff0c;二线制I2C CMOS串行EEPROM的简单介绍2&#xff0c;I2C总线特征介绍3&#xff0c;二线制I2C、CMOS串行EEPROM的读写操作4&#xff0c;EEPROM的Verilog HDL程序4.1&#xff0c;EEPROM的行为模型思路如下&#xff1a;…

【Kotlin】Kotlin环境搭建

1 前言 Kotlin 是一种现代但已经成熟的编程语言&#xff0c;由 JetBrains 公司于 2011 年设计和开发&#xff0c;并在 2012 年开源&#xff0c;在 2016 年发布 v1.0 版本。在 2017 年&#xff0c;Google 宣布 Kotlin 正式成为 Android 开发语言&#xff0c;这进一步推动了 Kotl…

【Go】一、Go语言基本语法与常用方法容器

GO基础 Go语言是由Google于2006年开源的静态语言 1972&#xff1a;&#xff08;C语言&#xff09; — 1983&#xff08;C&#xff09;—1991&#xff08;python&#xff09;—1995&#xff08;java、PHP、js&#xff09;—2005&#xff08;amd双核技术 web端新技术飞速发展&…

【Python程序开发系列】聊一聊github的pull request几种合并方式

一、什么是PR 在正常的工作流程中&#xff0c;PR 用于将一个分支的更改合并到另一个分支&#xff0c;而这些更改通常以提交的形式存在。每个提交都有一个唯一的提交 ID&#xff0c;用于标识和跟踪更改的历史。因此一般情况下PR包含源分支的多个commit提交记录&#xff08;pr_co…

数据结构_找环,破环题-2.5

一. 判断单链表有无环 a. 错误的思路&#xff1a;遍历陷入死循环 1&#xff09;和相交的遍历思路一样&#xff0c;找指向相同。 错误点 一直在死循环。 思考点&#xff1a;如何破环 b. 个人思路&#xff1a;反转链表回首结点 1&#xff09;目前的经验&#xff0c;无非就…