有条件的Envers审计 [英] Conditional Envers Auditing
问题描述
我有一个要求,只需在状态字段的更改上审核记录。我遵循文档章节教程15.8。有条件审计。
第1步:关闭自动Envers事件监听器注册。我有以下内容:
< prop key =hibernate.listeners.envers.autoRegister> false< / prop>
第二步:为适当的事件侦听器创建子类。
public class DeleteEnversListener extends EnversPostDeleteEventListenerImpl {
private static final long serialVersionUID = 5906427978349712224L;
private static Log log = LogFactory.getLog(DeleteEnversListener.class);
public DeleteEnversListener(AuditConfiguration enversConfiguration){
super(enversConfiguration);
}
@Override
public void onPostDelete(PostDeleteEvent event){
log.info(!!! just logging entity !!+ event.getEntity( ));
super.onPostDelete(event);
$ / code>
类似地,我有
- InsertEnversListener
- UpdateEnversListener
- DeleteEnversListener
- CollectionRecreateEnversListener
- PreCollectionRemoveEnversListener
- PreCollectionUpdateEnversListener
步骤3:创建自己的
org.hibernate.integrator.spi.Integrator
public class CustomEnversIntegrator extends EnversIntegrator {
private static Log log = LogFactory.getLog(CustomEnversIntegrator.class);
$ b @Override
public void integrate(配置配置,
SessionFactoryImplementor sessionFactory,
SessionFactoryServiceRegistry serviceRegistry){
super.integrate(configuration, sessionFactory,serviceRegistry);
final AuditConfiguration enversConfiguration = AuditConfiguration.getFor(configuration,serviceRegistry.getService(ClassLoaderService.class));
EventListenerRegistry listenerRegistry = serviceRegistry.getService(EventListenerRegistry.class);
System.out.println(注册事件监听器);
if(enversConfiguration.getEntCfg()。hasAuditedEntities()){
listenerRegistry.appendListeners(EventType.POST_INSERT,new InsertEnversListener(enversConfiguration));
listenerRegistry.appendListeners(EventType.POST_UPDATE,new UpdateEnversListener(enversConfiguration));
listenerRegistry.appendListeners(EventType.POST_DELETE,new DeleteEnversListener(enversConfiguration));
listenerRegistry.appendListeners(EventType.POST_COLLECTION_RECREATE,new CollectionRecreateEnversListener(enversConfiguration));
listenerRegistry.appendListeners(EventType.PRE_COLLECTION_REMOVE,new PreCollectionRemoveEnversListener(enversConfiguration));
listenerRegistry.appendListeners(EventType.PRE_COLLECTION_UPDATE,new PreCollectionUpdateEnversListener(enversConfiguration));
}
}
}
步骤4 :为了在Hibernate启动时自动使用集成器,您需要添加一个
META-INF / services / org.hibernate.integrator.spi.Interator
文件。这里是org.hibernate.integrator.spi.Integrator
文件的内容com.hib.sample.listener.CustomEnversIntegrator
我不确定,如果我缺少任何东西。我在Hibernate 4.1.8中使用JBOSS AS 7.0
解决方案尝试将积分文件放入:
sample.war\WEB-INF\classes\META-INF\services\ ...
I have a requirement where I want to audit records only on change of Status field. I've followed documentation chapter tutorial "15.8. Conditional auditing".
Step 1: Turn off automatic Envers event listeners registration. I have following:
<prop key="hibernate.listeners.envers.autoRegister">false</prop>
Step 2: Create subclasses for appropriate event listeners.
public class DeleteEnversListener extends EnversPostDeleteEventListenerImpl { private static final long serialVersionUID = 5906427978349712224L; private static Log log = LogFactory.getLog(DeleteEnversListener.class); public DeleteEnversListener(AuditConfiguration enversConfiguration) { super(enversConfiguration); } @Override public void onPostDelete(PostDeleteEvent event) { log.info("!!! just logging entity !! "+ event.getEntity()); super.onPostDelete(event); } }
In similar way, I have
- InsertEnversListener
- UpdateEnversListener
- DeleteEnversListener
- CollectionRecreateEnversListener
- PreCollectionRemoveEnversListener
- PreCollectionUpdateEnversListener
Step 3: Create your own implementation of
org.hibernate.integrator.spi.Integrator
public class CustomEnversIntegrator extends EnversIntegrator { private static Log log = LogFactory.getLog(CustomEnversIntegrator.class); @Override public void integrate(Configuration configuration, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { super.integrate(configuration, sessionFactory, serviceRegistry); final AuditConfiguration enversConfiguration = AuditConfiguration.getFor( configuration, serviceRegistry.getService( ClassLoaderService.class ) ); EventListenerRegistry listenerRegistry = serviceRegistry.getService( EventListenerRegistry.class ); System.out.println("Registering event listeners"); if (enversConfiguration.getEntCfg().hasAuditedEntities()) { listenerRegistry.appendListeners(EventType.POST_INSERT, new InsertEnversListener(enversConfiguration)); listenerRegistry.appendListeners(EventType.POST_UPDATE, new UpdateEnversListener(enversConfiguration)); listenerRegistry.appendListeners(EventType.POST_DELETE, new DeleteEnversListener(enversConfiguration ) ); listenerRegistry.appendListeners(EventType.POST_COLLECTION_RECREATE, new CollectionRecreateEnversListener(enversConfiguration ) ); listenerRegistry.appendListeners(EventType.PRE_COLLECTION_REMOVE, new PreCollectionRemoveEnversListener(enversConfiguration ) ); listenerRegistry.appendListeners(EventType.PRE_COLLECTION_UPDATE, new PreCollectionUpdateEnversListener(enversConfiguration ) ); } } }
Step 4: For the integrator to be automatically used when Hibernate starts up, you will need to add a
META-INF/services/org.hibernate.integrator.spi.Integrator
file. Here is content oforg.hibernate.integrator.spi.Integrator
filecom.hib.sample.listener.CustomEnversIntegrator
I am not sure, if I am missing anything. I am using JBOSS AS 7.0 with Hibernate 4.1.8
解决方案Try to place integrator file into:
sample.war\WEB-INF\classes\META-INF\services\...
这篇关于有条件的Envers审计的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!