繁体   English   中英

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

[英]How not to audit a join table and related entities using Hibernate Envers?

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

我有一个经过审计的实体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 ),我得到错误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列表(因为未检查FooBar之间的链接)。

谢谢。

当您在案例中使用@NotAudited时,看起来您正在使用@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)

RelationTargetAuditMode.NOT_AUDITED将不会审核目标实体 它仍将尝试审核FooList<Bar>属性,从而审计连接表。

来自文档:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM