2013-01-10 67 views
8

我有一个要求,只需要在状态字段更改时审计记录。我遵循了文档章节教程“15.8。有条件的审计”。有条件的Envers审计

步骤1:关闭自动Envers事件监听器注册。我有以下内容:

<prop key="hibernate.listeners.envers.autoRegister">false</prop> 

第2步:为适当的事件侦听器创建子类。

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); 
    } 
} 

以类似的方式,我有

  • InsertEnversListener
  • UpdateEnversListener
  • DeleteEnversListener
  • CollectionRecreateEnversListener
  • PreCollectionRemoveEnversListener
  • PreCollectionUpdateEnversL istener

第3步:创建自己的实现的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)); 
     } 

    } 
} 

第4步:要当Hibernate启动自动使用积分,您需要添加一个META-INF/services/org.hibernate.integrator.spi.Integrator文件。这里是org.hibernate.integrator.spi.Integrator文件

com.hib.sample.listener.CustomEnversIntegrator 

的内容我不知道,如果我错过什么。我使用JBoss AS 7.0与Hibernate 4.1.8

+0

目前发生了什么? 您的定制集成商代码是否已被调用? – adamw

+0

@adamw:我已经将sysout语句添加到集成器代码中,但没有一个出现。看来服务不被JBOSS认可。我已经使用Eclipse 4.2 Juno作为Dynamic Web项目创建了项目。 **不确定META-INF的位置是否正确**。任何建议.. –

+0

你检查了生成的jar/war,如果它有正确的地方的文件? – adamw

回答

1

尝试把积分文件到:

sample.war\WEB-INF\classes\META-INF\services\... 
0

也许......

就我而言,我使用Maven,我不得不包括在pom.xml中,以下行:<include>**/*.Integrator</include>,因为该文件未打包在.ear中。

pom.xml

<resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <includes> 
       <include>**/*.xml</include> 
       <include>**/*.Integrator</include> 
      </includes> 
     </resource> 
     ... 
0

创建文件org.hibernate.integrator.spi.Integrator文件夹META-INF /服务/下(含我的自定义集成的限定名) 我的maven项目的src/main/resources使我的自定义集成器代码被调用。

相关问题