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

时间:2012-07-12 10:10:49

标签: java hibernate 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之间的链接未经审核。)

感谢。

1 个答案:

答案 0 :(得分:26)

在您的情况下使用@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)时,您似乎正在使用@NotAudited

RelationTargetAuditMode.NOT_AUDITED根本不会审核目标实体。它仍会尝试审核List<Bar>的{​​{1}}属性,从而审核连接表。

来自文档:

  

如果要审核目标实体不在的关系   审计(例如,类似字典的实体,   它不会改变,也不需要审核),只需注释即可   与Foo。   然后,当阅读您的实体的历史版本时,关系将会   总是指向“当前”相关实体。