一尘不染

如何不使用Hibernate Envers审核联接表和相关实体?

hibernate

我使用Hibernate Envers审核我的实体。

我有一个审核的实体,Foo它具有List<Bar>as属性。但是,我不想审核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,因为它试图查询:

select ... from T_FOO_BAR_AUD x, T_BAR y where ...

我虽然使用@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED),但Hibernate Envers会保持与 当前 实体Bar项目的链接。
__

那么如何解决我的问题,而不必显式审核表T_BART_FOO_BAR(联接表)?在别人的话,当我检索列表bars从我的修订实体,我得到的名单bars,从我目前的实体(如之间的联系Foo,并Bar未经审计)。

谢谢。


阅读 273

收藏
2020-06-20

共1个答案

一尘不染

看起来@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)应该在使用@NotAudited的情况下使用。

RelationTargetAuditMode.NOT_AUDITED根本不会审计 目标实体
。仍将尝试审核的List<Bar>属性Foo,并因此审核联接表。

从文档:

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

2020-06-20