【问题标题】:Filling columns of modified flags for old revisions in Hibernate Envers在 Hibernate Envers 中为旧版本填充修改标志的列
【发布时间】:2019-05-29 21:56:54
【问题描述】:

我正在将修改后的标志添加到已经存在的审计表中。添加到表中的新修订的标志已正确填写,但我希望已填写现有修订的标志。

我可以在程序上检查更改的修订并更新列,但是为每个表编写特定的过程会花费很多时间。

例如,这是我的user_aud 表中的用户在添加列之前的数据:

id  |rev  |revtype|username     |password
100 |51544|1      |pdacostaporto|420bed36a05fa4668b1baeff18ffce96
100 |46343|0      |pdacostaporto|286755fad04869ca523320acce0dc6a4

当我在 User 实体中将 withModifiedFlag 设置为 true 时:

@Entity
@Audited(withModifiedFlag = true)
public class User {
   // Attributes, getters and setters...
}

然后,Hibernate 为标志添加列,但在现有行上使用 null 值,同时按预期为新修订工作:

id  |rev  |revtype|username     |password                         |username_mod |password_mod
100 |60745|1      |pdacostaporto|4305664d643844973ccb52cbb7c369f8 |false        |true
100 |51544|1      |pdacostaporto|420bed36a05fa4668b1baeff18ffce96 |null         |null
100 |46343|0      |pdacostaporto|286755fad04869ca523320acce0dc6a4 |null         |null

我想用正确的值填充现有行的null 列,如下所示:

id  |rev  |revtype|username     |password                         |username_mod |password_mod
100 |60745|1      |pdacostaporto|4305664d643844973ccb52cbb7c369f8 |false        |true
100 |51544|1      |pdacostaporto|420bed36a05fa4668b1baeff18ffce96 |false        |true
100 |46343|0      |pdacostaporto|286755fad04869ca523320acce0dc6a4 |false        |false

【问题讨论】:

  • 您使用的是哪个数据库平台?
  • @Naros 我正在使用 PostgreSQL 9.5

标签: hibernate jpa hibernate-envers


【解决方案1】:

不幸的是,如果您在表具有现有数据后启用该功能,Envers 将无法自动更新该功能的现有审计历史记录行;这是你必须手动完成的事情。

如果您决定手动执行此操作,逻辑如下:

  1. 具有REVTYPE=0 的行将始终具有等于true1_MOD 列。我注意到您在原始问题中将它们设置为 false,这是不正确的,可能会产生查询问题。
  2. 只有当数据列的值与先前版本中同一列中的值不同时,具有REVTYPE!=0 的行才会设置为true1

理想情况下,您应该能够利用数据库的元数据并编写一个脚本,该脚本将采用表名并执行所有必要的操作,而与表无关。

【讨论】:

  • 谢谢!您认为我应该更正问题中的 REVTYPE=0 情况吗?
  • 不会影响日常运营。唯一的影响是,如果您在查询中使用任何已更改的 API,那些使用 REVTYPE=0 的人可能会返回该行显然没有更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多