【问题标题】:Get original values from entity with Hibernate Envers使用 Hibernate Envers 从实体获取原始值
【发布时间】:2017-01-17 10:32:03
【问题描述】:

我已经在我的 Springboot 项目中配置了 Hibernate Envers,现在它正在保存我用 @Audited 注释的实体中的每个更改,但是,我有一个疑问。

Envers 存储实体的修订第一次更改完成后,在一次更改后,我将新值存储在实体表和 _AUD 表中。下一个更改存储在 _AUD 表中,因此我知道第一次更新后发生了什么更改,但原始值(第一次更改之前的值)丢失了。我错过了什么吗?有没有办法在更改完成之前保存值(因为我已经拥有实体表中的最后一个值)?。

【问题讨论】:

  • 您的_AUD 表中是否有一行带有REVTYPE=0 或者它们都是REVTYPE=1REVTYPE=2
  • @Naros 只有 1 和 2,所以……Envers 好像没有审核创建,会不会?
  • 是的。如何将记录插入表中以开始?记录是偶然保存在集合中的实体吗?
  • @Naros 我发现了问题。有一个在数据库中插入行的过程,而 Envers 似乎并不知道它,因此它不会审核这些操作。感谢您为我指明正确的方向。

标签: spring-boot hibernate-envers


【解决方案1】:

Envers 跟踪了三种不同的修订类型:

  • 添加(REVTYPE=0)-插入
  • MOD (REVTYPE=1) - 更新
  • DEL (REVTYPE=2) - 删除

这意味着如果 Hibernate 通过有状态会话插入、更新和删除条目,Envers 将获取这些更改并将适当的 REVTYPE 条目添加到审计表中。

如果一个条目在 Hibernate 的有状态会话范围之外被操作,Envers 将不会知道该更改并且相应的条目不会被添加到审计表中。根据 cmets,这就是您看不到 REVTYPE=0(又名 INSERT)操作的原因。

对于这种情况,您需要确保增加修订号序列并通过插入行的脚本或批处理手动添加适当的条目,以确保 Envers 架构具有完整的对实体历史的可见性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2011-07-10
    相关资源
    最近更新 更多