【问题标题】:Auditing with spring data jpa and hibernate使用 spring data jpa 和 hibernate 进行审计
【发布时间】:2020-10-19 18:50:33
【问题描述】:

我有一个带有 Spring Boot(v2.3.3) 和 Spring Data 的 Spring Web 应用程序。我有一个包含以下列的表格评估:

  1. 身份证
  2. 姓名
  3. 地址
  4. 版本

我的用例是表评估中名称和地址的任何更改都应创建一个新行,并使用相同的 id 递增版本。

因此,基本上只有当地址或名称更新时,才应在评估表中插入新记录,示例如下所示:

现有记录:

 Id       - 23
 Name     - John
 Address  - Southend
 Version  - 1

比如名字已经更新为 Ryan 应该有两行如下:

 Id       - 23
 Name     - John
 Address  - Southend
 Version  - 1

 Id       - 23
 Name     - Ryan
 Address  - Southend
 Version  - 2

因此,基本上任何名称和地址的更改都应在评估表中进行审核,并且版本应递增。

我看到了用于审计的 hibernate 环境,但需要创建一个新的审计表,因此我无法将其插入到评估表中,而且我不知道如何生成版本号。

我可以通过编程方式编写代码来实现这一点,但请问有其他可用的审计工具可以实现吗?

提前致谢

【问题讨论】:

    标签: java spring-boot hibernate spring-data-jpa hibernate-envers


    【解决方案1】:

    我不确定您的期望是什么。 为什么要使用一些工具?就像环境一样。

    问题与自动化和数据库有关,所以首先想到的是触发器

    也许最简单和最好的方法就是编写 PostUpdateEventListener

    public class VersionUpdateEventListener
        implements PostUpdateEventListener {
     
    @Override
    public void onPostUpdate(
            PostUpdateEvent event) {
    
            /*  
            1. getOldState() and getState() 
            2. check updated values
            3. update version +1 or not
            */
    
    }
    ...
    

    或者使用休眠@PostUpdate注解。

    我相信您会在 docs/google 中找到详细信息。

    【讨论】:

      【解决方案2】:

      您的主要实体应该有列 ID、名称、地址(不是版本)。你应该把@Audit 放在实体上。之后,您应该生成数据库表脚本(例如,参见 org.hibernate.tool.hbm2ddl.SchemaExport 中的方法 main)。 您将在脚本中看到主表和存档表(带有 _aud 后缀)。它将包含 Id、Name、Address、rev。 rev 字段是您的版本。当您在主实体中将名称更改为 Ryan 并提交时,envers 会自动将新条目添加到存档表中。

      【讨论】:

        【解决方案3】:

        如果支持触发器,请尝试触发器,因为它将涵盖直接从数据库更新的案例。

        【讨论】:

          猜你喜欢
          • 2017-07-09
          • 2018-02-04
          • 2016-03-03
          • 2017-05-22
          • 2019-11-17
          • 2012-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多