使用Hibernate Envers从实体获取原始值

时间:2017-01-17 10:32:03

标签: spring-boot hibernate-envers

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

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

1 个答案:

答案 0 :(得分:3)

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

  • ADD(REVTYPE = 0) - INSERT
  • MOD(REVTYPE = 1) - 更新
  • DEL(REVTYPE = 2) - DELETE

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

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

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