填充Hibernate Envers中旧版本的已修改标志的列

时间:2019-05-29 21:56:54

标签: hibernate jpa hibernate-envers

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

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

例如,这是我的user_aud表中用户的数据,然后添加以下列:

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

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

@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

1 个答案:

答案 0 :(得分:0)

不幸的是,如果在表具有现有数据之后启用该功能,则Envers当前没有自动的方法来更新该功能的现有审核历史记录行;这是您必须手动执行的操作。

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

  1. 具有REVTYPE=0的行将始终具有等于_MODtrue的{​​{1}}列。我注意到您在原始问题中将它们设置为1,这是不正确的,并且可能会导致查询问题。
  2. 具有false的行仅在data列的值与先前版本中同一列中的值不同时才设置为REVTYPE!=0true

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