首页 > Java > java教程 > 正文

Spring Boot整合Hibernate Envers教程

看不見的法師
发布: 2025-07-04 21:15:02
原创
833人浏览过

spring boot整合hibernate envers可通过以下步骤实现数据库版本控制:1. 添加hibernate-envers依赖;2. 配置审计表前缀、后缀及修订字段;3. 在实体类添加@audited启用审计;4. 使用auditreader查询历史记录;5. 自定义修订实体和监听器记录操作用户;6. 优化性能通过批量、异步、索引和选择性审计;7. 处理关联关系使用@audited、@auditjointable和@auditmappedby。

Spring Boot整合Hibernate Envers教程

Spring Boot整合Hibernate Envers,简单来说,就是给你的数据库操作加上版本控制。想象一下,每次修改数据都能留下痕迹,方便回溯和审计,是不是很酷?接下来,我们一步步来实现。

Spring Boot整合Hibernate Envers教程

解决方案

Spring Boot整合Hibernate Envers教程
  1. 添加依赖:

首先,在你的pom.xml文件中加入Hibernate Envers的依赖。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-envers</artifactId>
    <version>${hibernate.version}</version>
</dependency>
登录后复制

注意替换${hibernate.version}为你的Hibernate版本。

Spring Boot整合Hibernate Envers教程
  1. 配置Envers:

在application.properties或application.yml中,添加Envers的相关配置。

spring.jpa.properties.org.hibernate.envers.audit_table_prefix=AUDIT_
spring.jpa.properties.org.hibernate.envers.audit_table_suffix=_HIST
spring.jpa.properties.org.hibernate.envers.revision_field_name=REV
spring.jpa.properties.org.hibernate.envers.revision_type_field_name=REVTYPE
登录后复制

这些配置定义了审计表的命名规则,以及修订信息的字段名。你可以根据需要自定义。

  1. 实体类注解:

在需要进行版本控制的实体类上,添加@Audited注解。

import org.hibernate.envers.Audited;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Audited
public class Product {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private Double price;

    // Getters and setters
}
登录后复制

这样,每次对Product实体进行增删改操作,Envers都会自动记录到审计表中。

  1. 审计表结构:

Envers会自动创建审计表,表名通常是AUDIT_ + 原表名 + _HIST。审计表包含原表的所有字段,以及修订信息字段,例如REV(修订号)和REVTYPE(修订类型)。

  1. 查询历史数据:

使用AuditReader接口查询历史数据。

import org.hibernate.envers.AuditReader;
import org.hibernate.envers.AuditReaderFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;

@Service
public class AuditService {

    @PersistenceContext
    private EntityManager entityManager;

    public List<Number> getRevisions(Long productId) {
        AuditReader auditReader = AuditReaderFactory.get(entityManager);
        return auditReader.getRevisions(Product.class, productId);
    }

    public Product findProductAtRevision(Long productId, Number revision) {
        AuditReader auditReader = AuditReaderFactory.get(entityManager);
        return auditReader.find(Product.class, productId, revision);
    }
}
登录后复制

这个AuditService提供了两个方法:getRevisions用于获取指定ID的实体的所有修订号,findProductAtRevision用于获取指定修订号的实体数据。

如何自定义审计信息?

默认情况下,Envers只记录修订号和修订类型。如果需要记录更多信息,例如操作用户,可以自定义修订信息实体。

  1. 创建修订信息实体:
import org.hibernate.envers.DefaultRevisionEntity;
import org.hibernate.envers.RevisionEntity;

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "REVISION_INFO")
@RevisionEntity(CustomRevisionListener.class)
public class CustomRevisionEntity extends DefaultRevisionEntity {

    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
登录后复制
  1. 创建修订监听器:
import org.hibernate.envers.RevisionListener;
import org.springframework.security.core.context.SecurityContextHolder;

public class CustomRevisionListener implements RevisionListener {

    @Override
    public void newRevision(Object revisionEntity) {
        CustomRevisionEntity customRevisionEntity = (CustomRevisionEntity) revisionEntity;
        String username = SecurityContextHolder.getContext().getAuthentication().getName();
        customRevisionEntity.setUsername(username);
    }
}
登录后复制
  1. 配置修订信息实体:

在application.properties中,配置修订信息实体的类名。

spring.jpa.properties.org.hibernate.envers.revision_entity=com.example.CustomRevisionEntity
登录后复制

Envers性能优化有哪些技巧?

Envers在记录审计信息时,会对数据库产生额外的写入操作。为了优化性能,可以考虑以下技巧:

  1. 批量审计:

Envers默认每次操作都立即写入审计信息。可以配置批量审计,将多次操作合并成一次写入。

spring.jpa.properties.org.hibernate.envers.global_with_modified_flag=true
登录后复制
  1. 异步审计:

将审计操作放入异步队列中,避免阻塞主线程。

  1. 索引优化:

在审计表上创建合适的索引,加快查询速度。

  1. 只审计关键字段:

使用@NotAudited注解,排除不需要审计的字段。

如何处理关联关系的版本控制?

当实体之间存在关联关系时,需要考虑如何进行版本控制。

  1. 单向关联:

如果只是单向关联,可以在关联字段上添加@Audited注解。

  1. 双向关联:

如果存在双向关联,需要避免循环引用。可以使用@AuditJoinTable注解,指定关联表的审计方式。

  1. 集合关联:

对于集合类型的关联,可以使用@AuditMappedBy注解,指定关联关系的映射方式。

这些配置可以根据实际情况进行调整,选择最适合你的应用场景的方案。关键在于理解Envers的工作原理,并结合实际需求进行灵活配置。

以上就是Spring Boot整合Hibernate Envers教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号