我使用Hibernate Envers审核我的实体。
我有一个审核的实体,Foo它具有List<Bar>as属性。但是,我不想审核Bar实体。因此,我写道:
Foo
List<Bar>
Bar
@Entity @Audited public class Foo { @JoinTable(name = "T_FOO_BAR", joinColumns = @JoinColumn(name = "FOO_ID"), inverseJoinColumns = @JoinColumn(name = "BAR_ID")) @ManyToMany(cascade = PERSIST) @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) public List<Bar> getBars() { return bars; } }
现在,我要检索的修订Foo:
AuditReader reader = AuditReaderFactory.get(getEntityManager()); Foo revision = (Foo) reader.createQuery().forEntitiesAtRevision(Foo.class, 42).getSingleResult();
不幸的是,当我想检索所有数据时(即,当它延迟加载时bars),我得到了error ORA-00942: table or view does not exist,因为它试图查询:
bars
ORA-00942: table or view does not exist
select ... from T_FOO_BAR_AUD x, T_BAR y where ...
我虽然使用@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED),但Hibernate Envers会保持与 当前 实体Bar项目的链接。 __
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
那么如何解决我的问题,而不必显式审核表T_BAR和T_FOO_BAR(联接表)?在别人的话,当我检索列表bars从我的修订实体,我得到的名单bars,从我目前的实体(如之间的联系Foo,并Bar未经审计)。
T_BAR
T_FOO_BAR
谢谢。
看起来@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)应该在使用@NotAudited的情况下使用。
@NotAudited
RelationTargetAuditMode.NOT_AUDITED根本不会审计 目标实体 。仍将尝试审核的List<Bar>属性Foo,并因此审核联接表。
RelationTargetAuditMode.NOT_AUDITED
从文档:
如果您要审核不审核目标实体的关系(例如,类似字典的实体就是这种情况,它们不会更改且不必审核),只需用注释即可@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)。然后,在读取您实体的历史版本时,该关系将始终指向与“当前”相关的实体。