当前位置: 首页 > 知识库问答 >
问题:

基于字段级别值更改的Hibernate版本

劳仲渊
2023-03-14

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

使用的技术:< code>Spring Boot,< code>Spring Data JPA,< code > Hibernate en vers 5 . 2 . 10

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

步骤1:用户表:当新用户注册时,最初帐户状态将是电子邮件验证待定

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更改为活动

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都会创建新的修订版并在审核表中添加条目

试图实现:当帐户状态发生任何变化时,Hiberate Envers会创建新的版本。基本上,我想避免审计表中的修订号3。这意味着我不想审核电话号码的变更

是否有任何方法可以控制HiberNate Enver仅对特定字段级别的更改(如account_status)进行审核?

谁能帮我实现这一点的最佳方法

共有1个答案

洪季萌
2023-03-14

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

如您所知,Envers附带了两个注释,< code>@Audited和< code>@NotAudited。

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

如果在这个用例中有一个字段您不想跟踪,您只需用另一个注释注释该字段,@NotAudited,如下所示:

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

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

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

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

在这种情况下,phoneNumber不被审核,而状态属性将被审核。

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

 类似资料:
  • 我是XSLT新手,希望能得到一些帮助。 我目前有一个XML,它包含以下格式的多个副本: 我的任务是替换id属性的值。我需要根据代码的数字部分改变这个值。如果值大于850000,格式应该改为USA868509。如果该值小于850000,则将id值更改为仅包括数字。XML中的其余值应保持完全相同。 我目前拥有以下xslt: 我很难确定要更改的值,因为XSLT不执行变量循环。有没有办法更改XSLT以获得

  • 假设我有两个字段F1和f2。我想将F1更新为。我可以在Mongo中使用一个更新命令吗?

  • Java Checkstyle插件刚刚更新到6.0版本(Java8支持)。看来gradle用的是旧版本。我如何升级gradle checkstyle插件到更新的版本?

  • 我有4个输入字段如下。名称,计数,金额,价格。和两个文本字段,佣金和总额。 如果用户输入价格和计数值,则应计算金额(价格*计数)。如果用户输入价格和金额值,则应计算计数(金额/价格)。在这两种情况下,佣金=0.02*金额和总额=金额佣金都应更新。 所以,我尝试了下面的代码片段作为根据价格更新金额和佣金的开始。但是它没有更新。 //应用程序。js //createCoins.jsx 你能推荐一下吗。

  • 我想在我的中添加一种,当用户更改的值时,应用程序会在控制台上打印一些内容。 我搜索了一下,发现了以下非常类似的问题:将Listener值更改为JTextField 上述问题的答案非常清晰有效,但不幸的是,它只对(而不是)有用,因为它说您应该像这样使用DocumentListener: 但在JavaFX的文本字段中,您无法执行此操作。所以解决办法是什么? (用代码描述可能非常好,但如果不可能,任何提