envers 中 _aud 表中的旧值

Posted

技术标签:

【中文标题】envers 中 _aud 表中的旧值【英文标题】:Old value in _aud table in envers 【发布时间】:2020-09-23 15:32:11 【问题描述】:

我在 Spring Boot 中集成了休眠环境。现在我的要求是当 *_AUD 表中的值更改时,特定列也具有旧值。但是我在 Hibernate Envers 插件中看不到任何可用的功能。 请提出建议。

谢谢

【问题讨论】:

为什么? Envers 存储上一个快照,因此您可以比较上一个记录和下一个记录以获取更改。你想要的根本不是 envers 是如何工作的。 【参考方案1】:

很遗憾,您要执行的操作不受支持。

考虑一个实体并需要存储基本类型值(例如字符串或数字数据)并使其旧/新值由审计表中的两列表示是一回事;但是,当您超越基本实体映射到实体类型或集合之间存在关系的映射时;您开始发现尝试将旧/新数据存储在同一行中效率不高,并且在某些情况下是可行的。

也就是说,您仍然可以使用包括 Envers Query API、Debezium 甚至基本数据库触发器在内的各种方法来读取审计历史记录并推断出这些旧值/新值。

【讨论】:

感谢您的回复。我打算使用本机查询以 revid 的降序获取特定实体主键的所有修订,然后在 java 中我试图比较 N 和 N+1 行以获取列的旧值和新值。您认为实现结果是好的还是有更好的选择? 我建议您改为查看AuditReader API。这为您提供了一个易于使用、流畅的审计查询界面,可以完全按照您描述的方式获取数据。它大量模仿了传统的 Hibernate Criteria API。该接口知道如何解释审计表关系,而无需您自己推断。

以上是关于envers 中 _aud 表中的旧值的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate Envers 修改了标志行为

Hibernate Envers - 添加历史数据

Rails - 在 before_save 中获取旧值

laravel 刀片中多选选项中的旧值

在更改之前获取输入的旧值并将总值更改为 + 或 -

Spring Boot 和 Hibernate Envers:手动更新 AUD-Table