我尝试审核一个实体,但我不想审核它的关系。如果我将@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED(放在@ManyToOne关系中,这就可以了,我没有任何例外,但是当我尝试在定义了参数映射的@onetomany中使用相同的注释时,我有一个例外,说我必须审计另一个实体。
例:
@Table(name = "OWNERS")
@Entity
@EntityListeners(AuditingEntityListener.class)
@Audited
public class Owner {
...
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@ManyToOne(fetch=FetchType.LAZY)
private User user;
...
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner" )
private Set<Pet> pets = new HashSet<Pet>();
...
}
当您使用 @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED( 时,您告诉休眠不是审核此实体,而是审核关系,因此休眠将保存引用实体的 ID。这就是为什么宠物必须是一个@Audited实体。
如果您根本不想存储关系,则需要使用@NotAudited
检查这个 Hibernate EnVers 中的 @NotAudited 和 RelationTargetAuditMode.NOT_AUDITED 有什么区别?
好吧,我认为您在这里有两种选择:
-
实际审计实体
Pet
,如果适用; -
使用批注
@NotAudited
而不是@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
。想一想,Owner
的审计表不必保留Pet
的关联。如果是,请使用选项 1。
希望对您有所帮助!