2011-10-04 68 views
2

我想實現一個簡單的基於Envers +攔截器的方法來審計我的Hibernate實體。爲此,按照典型的做法,有一個BaseEntity與所有的審計特性:Envers with Hibernate Interceptor,onDelete

BaseEntity{ 
    createdOn; 
    createdBy; 
    updatedOn; 
    updatedBy; 
} 

AuditInterceptor,我已經覆蓋onFlushDirtyonSave方法來操作,這取決於它是否是一個實體保存或更新上述屬性。一切按預期保存和更新。

我面臨的問題是:我需要一種方法來能夠操作Delete操作的上述屬性。覆蓋onDelete的確給我一個state[]數組的句柄,但修改它並不反映在_AUD(審計)表中。簡而言之:我希望能夠審計審計表中的刪除操作。

有沒有解決方法,或者我錯過了什麼?

回答

1

我不認爲你需要實現onSave,onFlushDirty方法。

你只需要實現RevisionListener接口。如果你在這裏遵循這個模式,你不需要將這些屬性(createdOn等)添加到你的實體中(除非你需要它們進行正常操作)。

請參閱http://docs.jboss.org/hibernate/envers/3.6/reference/en-US/html_single/#revisionlog瞭解更多詳情。在這裏的例子中,他們使用Seam來獲取登錄的用戶。

Envers允許您將您的審計與您的實體分開,從而保持您的正常模型清潔並最小化執行審計所需的代碼。

+1

哇。當我第一次看到你的答案時,我認爲這個人錯過了這個觀點。但事實證明,我始終忽略了這一點。非常感謝! – pugmarx