Spring Data JPA审计

news2025/1/15 22:34:03

Spring Data JPA为跟踪持久性层的变化提供了很好的支持。通过使用审核,我们可以存储或记录有关实体更改的信息,例如谁创建或更改了实体以及何时进行更改。

我们可以利用实体字段上的@CreatedBy,@CreatedDate,@LastModifiedDate,@LastModifiedBy注释来指示 Spring JPA 透明地填充这些字段。我们可以按如下方式使用注释:

@Entity
public class Category {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private Long title;
    
    @CreatedBy
    private Long createdBy;

    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedBy
    private Long lastModifiedBy;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;
    
    // getters and setter..
}

大多数实体通常需要审计功能,因此创建和抽象包含审计字段的Auditable类并通过需要审计的实体扩展抽象类是一种更好的方法。通过这种方式,我们将避免在所有实体中重复相同的字段。

创建抽象可审计类

我们可以创建一个 Abstract 类来包含审计相关字段,如下所示:

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Auditable {

    @CreatedBy
    @Column(columnDefinition = "bigint default 1", updatable = false)
    protected Long createdBy;

    @CreatedDate
    @Column(columnDefinition = "timestamp default '2020-04-10 20:47:05.967394'", updatable = false)
    protected LocalDateTime createdDate;

    @LastModifiedBy
    @Column(columnDefinition = "bigint default 1")
    protected Long lastModifiedBy;

    @LastModifiedDate
    @Column(columnDefinition = "timestamp default '2020-04-10 20:47:05.967394'")
    protected LocalDateTime lastModifiedDate;

    public Long getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(Long createdBy) {
        this.createdBy = createdBy;
    }

    public LocalDateTime getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDate(LocalDateTime createdDate) {
        this.createdDate = createdDate;
    }

    public Long getLastModifiedBy() {
        return lastModifiedBy;
    }

    public void setLastModifiedBy(Long lastModifiedBy) {
        this.lastModifiedBy = lastModifiedBy;
    }

    public LocalDateTime getLastModifiedDate() {
        return lastModifiedDate;
    }

    public void setLastModifiedDate(LocalDateTime lastModifiedDate) {
        this.lastModifiedDate = lastModifiedDate;
    }
}

@MappedSuperclass注解用于指定类本身不是实体,但其属性可以采用与实体相同的方式映射,但是此映射仅适用于其子类。所以每个类继承抽象类Auditable将包含这些属性。

@EntityListeners注释用于配置AuditingEntityListener其中包含方法@PrePersist和@PreUpdate,以便捕获审核信息​​​​​​​

启用审核功能

为了在 Spring 中启用审计功能,我们需要使用@EnableJpaAuditing注释。

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

提供审计师

createdDatelastModifiedDate字段根据当前时间填充。此外,createdBy​​​​​​​​​​​​​​和lastModifiedBy需要一种方法来获取正在执行操作的用户。为了提供这些信息,我们需要实现AuditorAware接口。​​​​​​​​​​​​​​

@Component
public class AuditAwareImpl implements AuditorAware <Long> {

    @Override
    public Optional <Long> getCurrentAuditor() {
        ApplicationUser principal = (ApplicationUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        return Optional.of(principal.getId());
    }
}

我们添加了 getCurrentAuditor的实现,因为它被调用以检索正在执行操作的用户。

扩展实体中的可审核类

现在我们可以在要使用的实体中扩展类 Auditable审计.例如:

@Entity
@Data
public class Category extends Auditable {

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;
    private String title;

    // ..
}

审核字段将自动填充:

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

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

相关文章

PointNet 和 PointNet++ 作者讲座学习笔记

文章目录前人的工作三维数据的表达形式把点云转化为体素&#xff0c;再用3D CNNPointNet两个挑战置换不变性旋转不变性PointNet的分类网络PointNet的分割网络PointNet的限制PointNet多级点云特征学习分类分割小区域大小参考资料前人的工作 三维数据的表达形式 点云&#xff1…

Adaptive AUTOSAR Technology Sharing

文章目录一、目录二、未来汽车基础设施需求三、整车架构四、CP vs AP五、AP架构1.Execution Management与State Management的关系2.Service-oriented communication2.Diagnostic Management3.Persistency4.Log and Trace5.安全支持6.安全方法7.信息安全8. AutoSar&#xff1a;T…

Selenium4之CDP

相较于以前的版本&#xff0c;Selenium4除了推出了relative Locators&#xff0c;还有一个比较重要的更新就是对于Chrome Dev Tools Protocol的支持。 Chrome Dev Tools Protocol帮助用户监测、检查、调试和模版化Chrome浏览器以及基于Chromium的其它浏览器&#xff08;比如EDG…

Spring Boot 2.x系列【27】应用篇之代码混淆

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot版本2.7.0 文章目录概述代码混淆ProGuard使用Maven 插件直接使用工具混淆概述 代码混淆 代码混淆(Obfuscated code)亦称花指令&#xff0c;是将计算机程序的代码&#xff0c;转换成…

创建.NET MAUI程序

.NET MAUI&#xff0c;先说说读音&#xff0c;Maui&#xff0c;英 [ˈmaui]&#xff0c; 美 [ˈmaʊi]&#xff0c;直接读&#xff1a;毛伊&#xff0c;或者读大写字母MAUI。 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移动和…

混合云和多云:差异和相似之处

一般来说&#xff0c;云计算是服务器的集合&#xff0c;您可以通过 Internet 访问其资源。要访问云服务/资源&#xff0c;您需要一个云服务提供商根据您的业务需求为您提供服务。混合云和多云是两种比较流行的云计算类型&#xff0c;下文主要对两者的差异和相似之处作出详解&am…

CD147单克隆抗体通过酰胺反应偶联到Dox-CMCh-BAPE聚合物胶束/CBZ-AAN-Dox的制备

小编在这里给大家分享了CD147单克隆抗体通过酰胺反应偶联到Dox-CMCh-BAPE聚合物胶束/CBZ-AAN-Dox的制备&#xff0c;和小编一起来看&#xff01; 瑞禧分享-CBZ-AAN-Dox的研究&#xff1a; 通过计算机辅助药物设计和化学合成&#xff0c;我们获得并研究了前药N-苄氧基羰基Ala-…

力扣 146. LRU 缓存

题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返…

基于PHP+MySQL二手书交易系统

随着时代的变迁和人们的对知识的汲取,人们需要不断的购买一些新的图书来进行学习,但是这些图书在使用过一点时间之后其价值也会在拥有者手中变的没有那么高了,但是对于没有阅读和使用过这本书的人来说其还是具有更好的价值的,如果直接购买新书价格比较昂贵,对于拥有者来说如果将…

6个好用到爆的音频、配乐素材网站,BGM都在这里了

现在只要有一部手机&#xff0c;人人都能成为视频创作者。一个好的视频不能缺少的就是内容、配乐&#xff0c;越来越注重版权的当下&#xff0c;音效素材使用不当造成侵权的案例层出不穷。为了避免侵权&#xff0c;找素材让很多创作者很头疼。 今天我就整理了6个可以免费下载&a…

Hibernate多表的关联插入

一、一对多关系&#xff1a; “一”的一方为主表&#xff0c;“多”的一方为副表&#xff0c;主表关联副表&#xff0c;应该在主表中加入副表对象作为属性。 根据顾客ID查询顾客信息 &#xff08;一&#xff09; &#xff0c;同时将顾客名下所有订单查出 &#xff08;多&#…

公司建设网站的好处及优势

企业为什么要建网站&#xff1f;企业建站的好处和优势&#xff01;在新的世纪里&#xff0c;互联网将进入一个全新的阶段&#xff0c;信息技术的发展将带动其他行业的发展&#xff0c;所有行业都将与之深度融合和渗透。 越来越多的企业开始从对互联网的认识阶段走向认同和行动…

在关系数据库中允许空值的一些缺点

早在 2020 年&#xff0c;我们就了解了关系数据库系统中的 NULL 值及其用途。正如那篇文章所述&#xff0c;NULL 值已成为一个特殊标记&#xff0c;表示不存在任何数值。你也可以说 NULL 值可能表示列可能有一个值&#xff0c;但是你还不知道该值是什么。在这种情况下&#xff…

Python: 打包发布到PyPi上

经常会碰到python包要打包成sdk放到PyPi上开源的情况。 下面的操作具体参考&#xff1a;https://packaging.python.org/en/latest/tutorials/packaging-projects/。 一、准备 1、pyproject.toml 我的具体如下 [build-system] requires ["setuptools>61.0"] bu…

atguigu8 集群

0. 集群介绍 &#xff08;1&#xff09;集群的目标 • 高可用&#xff08;High Availability&#xff09;&#xff0c;是当一台服务器停止服务后&#xff0c;对于业务及用户毫无影 响。 停止服务的原因可能由于网卡、路由器、机房、CPU负载过高、内存溢出、自 然灾害等不可预…

基于Matlab使用线性FM波形对带状合成孔径雷达系统建模(附源码)

目录 一、合成孔径雷达成像 二、雷达配置 三、场景配置 四、SAR 信号模拟 五、总结 六、程序 此示例说明如何使用线性 FM &#xff08;LFM&#xff09; 波形对基于带状图的合成孔径雷达 &#xff08;SAR&#xff09; 系统进行建模。SAR是一种侧视机载雷达&#xff0c;与真实…

布隆过滤器原理,优缺点

介绍&#xff1a; 位图&#xff1a;int[10]&#xff0c;每个int类型的整数是4*832个bit&#xff0c;则int[10]⼀共有320 bit&#xff0c;每个bit⾮0即1&#xff0c;初始化时都是0 添加数据时&#xff1a;将数据进⾏hash得到hash值&#xff0c;对应到bit位&#xff0c;将该bit改…

Koa.js搭建简单服务器,连接数据库

Koa.js搭建简单服务器&#xff0c;连接数据库1. 环境node v7.6版本以上2. 创建服务安装依赖3. 根目录新建index.js&#xff0c;新建router.js&#xff0c;controller文件夹4. 浏览器访问5. 连接mysql6. 查询测试7、其它1. 环境node v7.6版本以上 2. 创建服务安装依赖 新建文件…

Origin绘制折线图

Origin常用功能见&#xff1a; Origin常用功能_Dezeming的博客-CSDN博客Origin支持各种各样的2D/3D图形。Origin中的数据分析功能包括统计&#xff0c;​信号处理&#xff0c;曲线拟合以及峰值分析。Origin中的曲线拟合是采用基于Levernberg-Marquardt算法&#xff08;LMA&…

软件设计模式复习

一、统一建模语言 1.统一建模语言知识点 二、面向对象设计原则 史上最全设计模式导学目录&#xff08;完整版&#xff09; 三、设计模式概述 1.定义&#xff1a;设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代…