Spring Data Envers 数据审计实战

news2024/11/19 15:36:44

随着各行各业信息化发展,决策者们越来越意识到数据版本追踪的重要性,尤其是上市公司,数据对于他们尤为重要。考虑到研发成本,对重要表单数据支持页面级的修改历史查看、对所有业务数据支持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.coloradmin.cn/o/1434867.html

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

相关文章

基于OpenCV灰度图像转GCode的斜向扫描实现

基于OpenCV灰度图像转GCode的斜向扫描实现基于OpenCV灰度图像转GCode的斜向扫描实现 引言激光雕刻简介OpenCV简介实现步骤 1.导入必要的库2. 读取灰度图像3. 图像预处理4. 生成GCode5. 保存生成的GCode6. 灰度图像斜向扫描代码示例 总结 系列文章 ⭐深入理解G0和G1指令&…

通过遵循最佳做法来提高 EDA 和 HPC 应用程序的 Azure NetApp 文件性能

介绍 Azure NetApp 文件是一项托管存储解决方案&#xff0c;适用于各种方案&#xff0c;包括高性能计算 (HPC) 基础结构。 低延迟和每秒高 I/O 操作数 (IOPS) 对于大规模企业而言是一种很好的组合。 假设你就职于一家半导体公司。 你的任务是设计公司的集成电路芯片&#xff…

问题:塑瓷后的牙冠要比完成的牙冠大() #学习方法#其他

问题&#xff1a;塑瓷后的牙冠要比完成的牙冠大&#xff08;&#xff09; A.10% B.10%-15% C.15%-20% D.20%-30% E.50% 参考答案如图所示

mysql8通过binlog恢复数据

参考资料: 通过binlog恢复误update的数据(一)_binlog 恢复update-CSDN博客 记录一次工作中的误删除&#xff0c;使用binlog恢复数据的问题。 1&#xff1a;找到mysql8的binlog文件。 2&#xff1a;把binlog文件转换为初始sql文件 mysqlbinlog -vv --base64-outputdecode-row…

【CSS】什么是BFC?BFC有什么作用?

【CSS】什么是BFC&#xff1f;BFC有什么作用&#xff1f; 一、BFC概念二、触发BFC三、BFC特性即应用场景1、解决margin塌陷的问题2、避免外边距margin重叠&#xff08;margin合并&#xff09;3、清除浮动4、阻止元素被浮动元素覆盖 一、BFC概念 BFC(block formatting context)…

【已解决】pt文件转onnx后再转rknn时得到推理图片出现大量锚框变花屏

前言 环境介绍&#xff1a; 1.编译环境 Ubuntu 18.04.5 LTS 2.RKNN版本 py3.8-rknn2-1.4.0 3.单板 迅为itop-3568开发板 一、现象 采用yolov5训练并将pt转换为onnx&#xff0c;再将onnx采用py3.8-rknn2-1.4.0推理转换为rknn&#xff0c;rknn模型能正常转换&#xff0c;…

Mac OS中创建适合网络备份的加密镜像文件:详细步骤与参数选择

这篇文章提供了在Mac OS中创建适合网络备份的加密镜像文件的详细步骤&#xff0c;同时探讨了在选择相关参数时的关键考虑因素&#xff0c;以确保用户能够安全、高效地存储和保护重要数据。 创建步骤 在Mac OS Monterey中&#xff0c;你可以使用“磁盘工具”&#xff08;Disk …

Django通过Json配置文件分配多个定时任务

def load_config():with open("rule.json", rb)as f:config json.load(f)return configdef job(task_name, config, time_interval):# ... 通过task_name判断进行操作if task_name get_data_times:passdef main():config load_config()for task_name, task_value…

代码随想录算法训练营第三十六天|背包问题

01背包问题 二维 代码随想录 视频讲解&#xff1a;带你学透0-1背包问题&#xff01;| 关于背包问题&#xff0c;你不清楚的地方&#xff0c;这里都讲了&#xff01;| 动态规划经典问题 | 数据结构与算法_哔哩哔哩_bilibili public class BagProblem {public static void main(…

LoRA:语言模型微调的计算资源优化策略

编者按&#xff1a;随着数据量和计算能力的增加&#xff0c;大模型的参数量也在不断增加&#xff0c;同时进行大模型微调的成本也变得越来越高。全参数微调需要大量的计算资源和时间&#xff0c;且在进行切换下游任务时代价高昂。 本文作者介绍了一种新方法 LoRA&#xff0c;可…

C++多态_C++回顾

多态的概念 通俗的说多态就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的概念。 什么是多态 静态的多态 静态的多态即函数重载&#xff0c;编译时是参数匹配和函数名修饰规则。 动态的多态 运行时实现&#xff0c;跟指…

【Java网络编程05】网络原理进阶(三)

1. HTTP协议概述 HTTP协议&#xff1a;又被称为"超文本传输协议"&#xff0c;是一种使用非常广泛的应用层协议&#xff0c;我们之前在文件章节介绍过文本文件与二进制文件的区别&#xff0c;文本可以看做字符串&#xff08;能在utf8/gbk等编码表中查找到合法字符&am…

Unity类银河恶魔城学习记录1-14 AttackDirection源代码 P41

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili PlayerPrimaryAttackState.cs using System.Collections; using System.Co…

测试开发体系

软件测试 通过手工或者工具对 “被测对象”进行测试验证实际结果与预期结果之间是否存在差异 软件测试作用 通过测试工作可以发现并修复软件当中存在的缺陷&#xff0c;从而提高用户对产品的使用信心测试可以降低同类型产品开发遇到问题的风险 软件缺陷 软件缺陷被测试工程…

京东数据分析(电商数据查询):2023年冲锋衣行业大卖,销售额同比增长96%!

在服装行业&#xff0c;每年都会出现不同的服装爆款&#xff0c;成为人们时尚穿搭的新宠&#xff0c;2023年的服装爆款无疑是冲锋衣。 在社交平台上&#xff0c;冲锋衣鲨鱼裤运动鞋的搭配一时间成为许多女性消费者的户外潮流穿搭&#xff0c;不少网友点赞表示“很出片”。对于…

python创建pdf文件

目录 一&#xff1a;使用reportlab库 二&#xff1a;使用使pdf库 在Python中生成PDF文件可以使用多种库&#xff0c;其中最常用的是reportlab和fpdf。以下是使用这两个库生成PDF文件的示例代码&#xff1a; 一&#xff1a;使用reportlab库 1&#xff1a;写入文字信息 from r…

34 使用 LNMP 架构部署动态网站环境

源码包程序 LNMP 动态网站部署架构 LNMP 动态网站部署架构是一套由 Linux Nginx MySQL PHP 组成的动态网站系统 解决方案。 1. 准备工作 在使用源码包安装服务程序之前&#xff0c;首先要让安装主机具备编译程序源码的环境。这需要 具备 C 语言、C语言、Perl 语言的编译器&…

宝塔+php+ssh+vscode+虚拟机 远程调试

远程(虚拟机)宝塔 安装扩展 配置文件添加&#xff0c;zend_extension看你虚拟机的具体位置 [Xdebug] zend_extension/www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so xdebug.modedebug xdebug.start_with_requesttrigger xdebug.client_host&quo…

关于RabbitMQ面试题汇总

什么是消息队列&#xff1f;消息队列有什么用&#xff1f; 消息队列是一种在应用程序之间传递消息的通信机制。它是一种典型的生产者-消费者模型&#xff0c;其中生产者负责生成消息并将其发送到队列中&#xff0c;而消费者则从队列中获取消息并进行处理。消息队列的主要目的是…

spring boot学习第十篇:elastic search必须使用用户名密码授权后才能访问、在java代码中操作索引

前提条件&#xff1a;安装好了elastic search服务&#xff0c;参考&#xff1a;elastic search入门_ubuntu elasticsearch 密码-CSDN博客 1、配置elastic search必须使用用户名密码授权才能访问 1.1开启x-pack验证 修改config目录下面的elasticsearch.yml文件&#xff0c;添…