Hibernate Envers 基于 Field 级别的值变化

Hibernate Envers based on Field level value change

问题摘要:仅当使用 Hibernate Envers 更改特定字段时才需要拍摄数据库行的快照。

使用的技术: Spring BootSpring Data JPAHibernate Envers 5.2.10

当前行为:目前我有 Hibernate Envers 运行,它审核对每个对象所做的 table 更改。

第一步:用户Table: 当新用户注册时,最初account_status会是EMAIL_VERIFICATION_PENDING

id  user_name  email_id         phone_number   account_status
-------------------------------------------------------------------------
101 test_user  test@sample.com  123-123-1234   EMAIL_VERIFICATION_PENDING

用户审核Table

id  REV REVTYPE user_name  email_id        phone_number  account_status
-----------------------------------------------------------------------------------
1   1   0       test_user  test@sample.com  123-123-1234 EMAIL_VERIFICATION_PENDING

第二步:用户Table邮箱验证完成后,account_status变为PHONE_VERIFICATION_PENDING

id  user_name  email_id         phone_number   account_status
-------------------------------------------------------------------------
101 test_user  test@sample.com  123-123-1234   PHONE_VERIFICATION_PENDING

用户审核Table看起来像

id  REV REVTYPE user_name  email_id        phone_number  account_status
-----------------------------------------------------------------------------------
1   1   0       test_user  test@sample.com  123-123-1234 EMAIL_VERIFICATION_PENDING
2   2   1       test_user  test@sample.com  123-123-1234 PHONE_VERIFICATION_PENDING

第 3 步:用户 Table: 用户更改了他们的 phone 号码

id  user_name  email_id         phone_number   account_status
-------------------------------------------------------------------------
101 test_user  test@sample.com  111-222-3333   PHONE_VERIFICATION_PENDING

现在用户审核Table看起来像

id  REV REVTYPE user_name  email_id        phone_number  account_status
-----------------------------------------------------------------------------------
1   1   0       test_user  test@sample.com  123-123-1234 EMAIL_VERIFICATION_PENDING
2   2   1       test_user  test@sample.com  123-123-1234 PHONE_VERIFICATION_PENDING
3   3   1       test_user  test@sample.com  111-222-3333 PHONE_VERIFICATION_PENDING

第四步:用户Table:当Phone验证完成后,account_status变为ACTIVE

id  user_name  email_id         phone_number   account_status
-------------------------------------------------------------------------
101 test_user  test@sample.com  123-123-1234   ACTIVE

而用户审核Table看起来像

id  REV REVTYPE user_name  email_id        phone_number  account_status
-----------------------------------------------------------------------------------
1   1   0       test_user  test@sample.com  123-123-1234 EMAIL_VERIFICATION_PENDING
2   2   1       test_user  test@sample.com  123-123-1234 PHONE_VERIFICATION_PENDING
3   3   1       test_user  test@sample.com  111-222-3333 PHONE_VERIFICATION_PENDING
4   4   1       test_user  test@sample.com  111-222-3333 ACTIVE

注意:每当用户 table 发生任何变化时,Hibernate Envers 都会创建新的修订版并在审核中添加条目 table

试图实现:当 account_status 中有任何更改时,Hiberate Envers 创建新的修订版。 基本上,我想避免审计 table 中的修订号 3。这意味着我不想审计 phone 数字变化

有什么方法可以控制 Hibernate Envers 只审计特定字段级别的更改(比如 account_status)?

任何人都可以帮助我实现这一目标的最佳方法。

有几种方法可以实现。

如您所知,Envers 附带了两个注释,@Audited@NotAudited

典型的规范用例是用户将 @Audited 注释放在 class 级别,以指示 Envers 应该跟踪所有字段更改,而它正是这样做的。

如果您不想跟踪此用例中的某个字段,只需用另一个注释 @NotAudited 对该字段进行注释,如下所示:

@Audited
@Entity
class User {
  ...
  @NotAudited
  private String phoneNumber;
}

当您对要跟踪的大部分字段更感兴趣时,这是一种从审核中消除少量字段的超级简单方法 table。但有时用户对反向方法感兴趣,只跟踪大多数不感兴趣的字段子集。

在这种情况下,不注释 class 本身而是注释必须审核/跟踪的特定字段很有用,如下所示:

@Entity
class User {
  private String phoneNumber;
  @Audited
  private UserStatus status;
}

在这种情况下,phoneNumber 不会被审核,而 status 属性 会被审核。

虽然您可以将 @Audited 注释放在实体的主键字段上,但这不是必需的。无论如何,Envers 都会自动选取并应用主键值,因此这也有助于避免此处过于冗长。