9

ステータス フィールドの変更時にのみレコードを監査したいという要件があります。ドキュメントの章のチュートリアル「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 を使用しています

4

5 に答える 5

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>
       ...
于 2015-05-11T20:38:09.707 に答える
0

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

lazyInit = true を追加すると、カスタム インテグレーターがトリガーされました。

于 2018-10-25T09:58:43.427 に答える