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

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

4

3 回答 3

66

当您根本不希望对值/关系进行审计时,请在字段上使用 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/值)。

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

于 2016-07-08T15:10:10.233 回答
43

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

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

于 2011-04-21T23:03:13.700 回答
5

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

于 2018-06-27T07:43:08.670 回答