基于字段级值更改的Hibernate Envers

时间:2017-08-03 01:40:00

标签: spring spring-boot spring-data-jpa hibernate-envers

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

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

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

第1步:用户表:当新用户注册时,最初的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

用户审核表

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步:用户表完成电子邮件验证后,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

用户审核表看起来像

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步:用户表:用户更改了电话号码

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

现在用户审核表看起来像

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步:用户表:完成电话验证后,将account_status更改为ACTIVE

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

用户审核表看起来像

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

注意:每当用户表发生任何变化时,Hibernate Envers都会创建新版本并在审计表中添加条目

尝试实现:当account_status中的任何更改时,Hiberate Envers会创建新版本。 基本上,我想避免审计表中的第3号修订版。这意味着我不想审核电话号码变更

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

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

1 个答案:

答案 0 :(得分:1)

有几种方法可以实现这一目标。

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

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

如果您希望不跟踪此用例中的字段,则只需使用其他注释@NotAudited注释该字段,如下所示:

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

当您对要跟踪的大多数字段更感兴趣时,这是从审计表中消除少量字段的超级简单方法。但有时用户对逆方法感兴趣,只跟踪多数不感兴趣的字段子集。

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

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

在这种情况下,phoneNumber属性将不会审核status

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