问题摘要:只有在特定字段使用Hibernate Envers更改时才需要拍摄数据库行的快照。
使用的技术: Spring Boot
,Spring Data JPA
,Hibernate 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)?
任何人都可以帮助我实现这一目标的最佳方法。
答案 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会自动获取并应用主键值,这样有助于避免过多的冗长。