2011-10-04 50 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