Hibernate EnVers中@NotAudited和RelationTargetAuditMode.NOT_AUDITED有什么区别?

时间:2011-04-14 10:12:17

标签: java hibernate hibernate-envers

@NotAudited
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@OneToMany(mappedBy = "booking")
@OrderBy("bookingOrder")
private List<CustomerBooking> customerBookingList = new LinkedList<CustomerBooking>();

为什么同时使用?使用两者还是足够好?

3 个答案:

答案 0 :(得分:41)

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

您还可以将RelationTargetAuditMode应用于整个类,我相信对于类中的所有关系都不会审计另一端。这让我很困惑,因为我错误地使用这个注释来表示不审计下面的实体,这不是它的含义。如果您不希望审计实体,则根本没有实体类的审计注释。在引用该实体的其他审计实体上,您必须将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 /值)。

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

答案 1 :(得分:38)

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

  

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

答案 2 :(得分:1)

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