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

2022-09-01 13:13:43

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

我有一个经过审核的实体,它具有 as 属性。但是,我不想审核实体。因此,我写道:FooList<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();

不幸的是,当我想检索所有数据时(即当它延迟加载时),我得到错误,因为它试图查询:barsORA-00942: table or view does not exist

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

虽然使用,休眠Envers会保留与当前实体的项目的链接。@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)Bar

那么,如何解决我的问题,而不必显式审核表和(联接表)呢?换句话说,当我从我的修订实体检索列表时,我从我当前的实体中获得列表(因为链接和之间没有被审计)。T_BART_FOO_BARbarsbarsFooBar

谢谢。


答案 1

看起来你正在使用,而你应该在你的案例中使用。@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)@NotAudited

RelationTargetAuditMode.NOT_AUDITED根本不会审核目标实体。它仍然会尝试审核 的属性,从而审核联接表。List<Bar>Foo

从文档中:

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


答案 2

推荐