Hibernate Envers 修改了标志行为

Posted

技术标签:

【中文标题】Hibernate Envers 修改了标志行为【英文标题】:Hibernate Envers modified flag behavior 【发布时间】:2017-12-01 07:55:17 【问题描述】:

我将 Hibernate 与 Envers 一起使用,并且有一个实体,其中一些列用 @Audited(withModifiedFlag = true) 注释,即 _AUD 表中有一个额外的布尔列,指示该列是否已更新。

如果我保存一个新实体,则在 _AUD 表中写入一个相应的条目,revtype 为 0。我的 _MOD 列值有问题。如果该列为空,则 _MOD 条目的值为假,如果存在非空值,则 _MOD 条目为真。我认为对于一个新条目(即 revtype=0),将 all _MOD 值设置为 false 更合乎逻辑,因为这些列尚未被修改。有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

这些 _MOD 字段最终被设置为最初插入的值的主要原因是因为所有先前的实体状态都是 null 并且这些比较会产生差异(例如,非 null != null),因此它被视为已被修改。该功能不考虑正在执行的操作是INSERTUPDATE 还是DELETE

就个人而言,我发现当前的行为更合乎逻辑。

对于最初的ADD 操作,更改行为将迫使您有一些分支逻辑来处理基于修订类型的修订号的种子值更改,就像简单地使用@987654327 @ 字段行为现在意味着您可以简单地忽略修订类型/编号,只需在任何查询上使用切换。

很遗憾,您目前无法切换此行为。

我们可以考虑添加一个配置参数,该参数允许您影响 ADD 操作是否应被视为修改。如果它对您和其他人有用,请随时打开 JIRA here。

【讨论】:

以上是关于Hibernate Envers 修改了标志行为的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Hibernate Envers 在更新时不启动?

Hibernate Envers - 获取日期之间的修订和对象

Hibernate Envers:初始化 Envers 代理

Hibernate Envers @NotAudited 注解

Hibernate-Envers:审计动态组件

审计没有 Hibernate Envers 的 java 实体