【问题标题】:What's the difference between @NotAudited and RelationTargetAuditMode.NOT_AUDITED in Hibernate EnVers?Hibernate EnVers 中的@NotAudited 和 RelationTargetAuditMode.NOT_AUDITED 有什么区别?
【发布时间】:2011-08-05 10:09:46
【问题描述】:
@NotAudited
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@OneToMany(mappedBy = "booking")
@OrderBy("bookingOrder")
private List<CustomerBooking> customerBookingList = new LinkedList<CustomerBooking>();

为什么要同时使用?两者都用好还是一个就够了?

【问题讨论】:

    标签: java hibernate hibernate-envers


    【解决方案1】:

    当您根本不希望对值/关系进行审计时,对字段使用 NotAudited。我相信您可以在有或没有关系的字段上使用它,例如 OneToMany、ManyToMany 或只是 Column。如果您希望审计值而不是关系另一端的实体,请在关系字段上使用 RelationTargetAuditMode.NOT_AUDITED。例如,您希望审计 ID / 键值,但不审计相关表。

    您还可以将 RelationTargetAuditMode 应用于整个班级,我相信这只是说班级中的所有关系不要审核另一端。这让我很困惑,因为我错误地使用了这个注释来表示不审计下面的实体,这不是它的意思。如果您不希望对实体进行审计,则根本不要在实体类上添加 Audit 注释。在引用实体的其他已审计实体上,您必须对关系字段使用 NotAudited 或 RelationTargetAuditMode.NOT_AUDITED。

    官方文档对这个话题 (http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch15.html) 的描述不是很好,甚至根本没有提到 NotAudited。

    在我过去的项目中,我需要审核一组非常具体的表格,而不是其他表格,因此我需要使用这些注释。我与一些已审计实体的一些非审计实体有外键关系。我经常使用 RelationTargetAuditMode.NOT_AUDITED 注释,以便至少我审计外键值/ID,而不是关系另一端的实体。如果您没有此注释,您将得到一个运行时异常,其中 ENVERS 尝试将审计记录插入到未审计实体的审计表中,并且该表将不存在。我将 NotAudited 注释用于一些我不需要审计的 ManyToMany 连接表关系,并且审计实体表本身没有任何内容要记录(没有外键 ID/值)。

    哦,是的-文档没有说明如果您同时使用两者会发生什么(不确定哪个具有优先级),但我不认为在给定字段上同时使用两者。使用其中一种。

    【讨论】:

    • 关于 RelationTargetAuditMode.NOT_AUDITED 注释的非常有用的解释。官方文档在某些方面真的很糟糕......谢谢!
    • @Ryan 当您查询与标有RelationTargetAuditMode.Not_Audited 的实体有关系的已审计实体的修订数据时,它是否正确查找当前 引用的实体(即唯一的)?在我的例子中,envers 正在为一个不存在的审计表生成 SQL 语句,尽管有注释。
    【解决方案2】:

    审核目标实体及其关系是两件不同的事情。所以这取决于你需要什么。来自Hibernate Envers - Easy Entity Auditing 文档:

    如果您要审核未审核目标实体的关系(例如类似字典的实体,它们不会更改且无需审核),只需使用注释即可@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)。然后,在读取实体的历史版本时,关系将始终指向“当前”相关实体。

    【讨论】:

    • 我知道它的古老历史,但是......在原始问题的情况下,他必须使用@NotAudited,因为它是由目标实体处理的双向关系:CustomerBooking。至少对于 JPA 2.1 + Hibernate 4.3.10,@Audited(targetAuditMode=NOT_AUDITED) 在这种情况下不起作用。
    • 这个答案没有解释 NotAudited 与 RelationTargetMode.Not_AUDITED 之间的区别。它不指示何时使用其中一个。
    【解决方案3】:

    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 只有一种用法:当您拥有与未被审计实体的关系的被审计实体并且您希望在审计数据中获得关于未被审计实体 ID 的信息时。假设 CustomerBooking 已审核,而 Hotel 类未审核。对于 Hotel 字段,您有两个选择:@NotAudited(在这种情况下,您将根本没有历史数据中有关酒店的信息)或@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED),在这种情况下,您将始终在审计数据中拥有最新的酒店状态。 请注意,如果 Hotel 被审计 RelationTargetAuditMode.NOT_AUDITED 将被忽略(您将拥有 Hotel 的历史数据)。 @NotAudited 表示“我只是不关心历史数据中的这个字段”(它不会被保存,关系将为空,查看CustomerBooking 的历史数据时不会看到)

    【讨论】:

      猜你喜欢
      • 2013-12-21
      • 2016-05-27
      • 2011-08-06
      • 2021-09-11
      • 2011-08-17
      • 2011-12-27
      • 2018-06-12
      相关资源
      最近更新 更多