使用 Hibernate Envers 进行审计

Posted

技术标签:

【中文标题】使用 Hibernate Envers 进行审计【英文标题】:Audit Using Hibernate Envers 【发布时间】:2018-04-18 15:08:43 【问题描述】:

我正在使用休眠环境来记录我的数据,它也可以正常工作。这里的问题是,它在历史表中创建重复数据,即在历史表中创建数据,无论审计表是否有任何变化。我只想更改存储在我的历史记录表中的字段。我是休眠环境的新手。我能做什么?

【问题讨论】:

请提供您目前尝试过的相关解决方案。 @Garren- 我现在已经尝试过审核注释,但问题是历史表中的重复数据。还有其他方法吗? 【参考方案1】:

如果我正确理解了您的问题,Envers 不会那样工作,至少不是开箱即用。

Envers 是一种提交快照审计解决方案,在提交之前,它会检查被审计的实体状态并确定是否有任何属性已被修改,并记录该实体在该时间点的所有审计字段的快照。这意味着只有在没有修改任何属性时才会创建审核条目。

但它也使用 snapshot 方法,因为它非常适合 Query API。

考虑一下如果要在给定修订版中查找实体的查询必须从该修订版读取所有行回到开始时间,迭代每一行并合并捕获的列状态以仅实例化单行,则会出现效率低下结果集。

使用 snapshot 方法,它可以归结为以下查询,没有循环或迭代工作。

SELECT e FROM AuditedEntity e WHERE e.revisionNumber = :revisionNumber

从 I/O 的角度来看,这在数据库读取数据页和网络以将单行结果集而不是多行结果集流式传输到客户端时要高效得多。

我想说,在这种情况下,“空间很便宜”这句话确实适用,当您将其与您的应用程序以任何其他方式将面临的成本和效率低下进行比较时。

如果这是您希望 Envers 支持的东西,也许通过一些用户配置的策略,那么欢迎您在JIRA 中为hibernate-envers 记录一个新功能请求,我可以看看它的可行性。

【讨论】:

【参考方案2】:

我也有类似的问题。

在我的情况下,错误是审核字段的精度高于数据库字段。请看我对另一个话题的回复:https://***.com/a/65844949/13381019

【讨论】:

以上是关于使用 Hibernate Envers 进行审计的主要内容,如果未能解决你的问题,请参考以下文章

仅生成 Hibernate Envers 的审计表

在 Spring Hibernate java 项目中使用“Envers”审计表

审计没有 Hibernate Envers 的 java 实体

Hibernate Envers:初始化 Envers 代理

Hibernate-Envers:审计动态组件

Hibernate Envers - 在启动时填写审计表