28

我使用 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),我得到错误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被审计)。

谢谢。

4

1 回答 1

35

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

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

从文档:

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

于 2012-07-12T13:38:25.060 回答