簡體   English   中英

有條件的審計

[英]Conditional Envers Auditing

我有一個要求,我只想在狀態字段更改時審核記錄。 我遵循了文檔章節教程“ 15.8。條件審計”。

步驟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
  • PreCollectionUpdateEnversListener

步驟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

我不確定是否丟失任何東西。 我在Hibernate 4.1.8中使用JBOSS AS 7.0

這是用於條件Envers審核的僅Spring解決方案,而沒有丑陋的META-INF文件夾等。您需要的只是配置類中的Bean和CustomEnversEventListener

@Bean
public EventListenerRegistry listenerRegistry(EntityManagerFactory entityManagerFactory) {
    ServiceRegistryImplementor serviceRegistry = entityManagerFactory.unwrap(SessionFactoryImpl.class).getServiceRegistry();

    final EnversService enversService = serviceRegistry.getService(EnversService.class);
    EventListenerRegistry listenerRegistry = serviceRegistry.getService(EventListenerRegistry.class);

    listenerRegistry.setListeners(EventType.POST_UPDATE, new CustomEnversEventListener(enversService));
    return listenerRegistry;
  }

  public class CustomEnversEventListener extends EnversPostUpdateEventListenerImpl {

    CustomEnversEventListener(EnversService enversService) {
      super(enversService);
    }

    @Override
    public void onPostUpdate(PostUpdateEvent event) {

      // custom conditional stuff

      super.onPostUpdate(event);
    }
  }

如果您只想自定義一個偵聽器,即EnversPostUpdateEventListener,則無需禁用hibernate.listeners.envers.autoRegister即可讓Envers注冊另一個偵聽器。

然后,您可以通過listenerRegistry.setListeners覆蓋Envers偵聽器,或者通過listenerRegistry.appendListeners追加

嘗試將集成器文件放入:

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

也許...

就我而言,我使用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>
       ...

在maven項目src / main / resources下的META-INF / services /文件夾中創建文件org.hibernate.integrator.spi.Integrator (包含我的自定義集成器的限定名稱)使我的自定義集成器代碼被調用。

@ComponentScan(basePackages = {“ com.example.demo”},lazyInit = true)

添加lazyInit = true,為我觸發了自定義積分器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM