2012-07-12 53 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)。 然後,當閱讀您的實體的歷史版本時,關係將始終指向「當前」相關實體 。