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

2022-08-31 14:57:44
@NotAudited
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@OneToMany(mappedBy = "booking")
@OrderBy("bookingOrder")
private List<CustomerBooking> customerBookingList = new LinkedList<CustomerBooking>();

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


答案 1

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

你还可以将 RelationTargetAuditMode 应用于整个类,我相信这只是说,对于类中的所有关系,不要审核另一端。这让我感到困惑,因为我错误地使用此注释来表示不要审核下面的实体,这不是它的意思。只是如果不希望对实体类进行审核,则根本不对实体类进行审核批注。在引用该实体的其他已审核实体上,必须使用“未审核”或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 /值)。

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


答案 2

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

如果要审核关系,其中目标实体未被审核(例如,类似字典的实体就是这种情况,它们不会更改,也不必被审核),只需使用@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)对其进行注释。然后,在读取实体的历史版本时,关系将始终指向“当前”相关实体。


推荐