2012-07-12 52 views
13

我使用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),休眠Envers会保留链接s与Bar项目当前实体。

那么我怎样才能解决我的问题,而不必明确审计表T_BART_FOO_BAR(连接表)?换句话说,当我从我的修订实体中检索bars列表时,我从我的当前实体获得bars的列表(因为FooBar之间的链接未经审核)。

谢谢。

回答

18

它看起来像你使用@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)当你应该使用@NotAudited你的情况。

RelationTargetAuditMode.NOT_AUDITED将根本不会审计目标实体。它仍然会尝试审计FooList<Bar>属性,并因此审计连接表。

从文档:

如果要审核的关系,如果目标实体不是 审核(即例如用字典的实体, 不发生变化,情况不必审计),只需注释它 与@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)。 然后,当阅读您的实体的历史版本时,关系将始终指向“当前”相关实体 。