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

Rom*_*las 23 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,我想要检索以下版本Foo:

    AuditReader reader = AuditReaderFactory.get(getEntityManager());
    Foo revision = (Foo) reader.createQuery().forEntitiesAtRevision(Foo.class, 42).getSingleResult();
Run Code Online (Sandbox Code Playgroud)

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

select ... from T_FOO_BAR_AUD x, T_BAR y where ...
Run Code Online (Sandbox Code Playgroud)

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

那么如何解决我的问题,而不必明确地审计表T_BART_FOO_BAR(连接表)?换句话说,当我bars从我的修订实体中检索列表时,我bars从我当前的实体中获取列表(作为之间的链接FooBar未被审计的链接).

谢谢.

bvu*_*laj 27

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

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

来自文档:

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