如何使用org.hibernate.action.spi.AfterTransactionCompletionProcess? [英] How to use org.hibernate.action.spi.AfterTransactionCompletionProcess?

查看:47
本文介绍了如何使用org.hibernate.action.spi.AfterTransactionCompletionProcess?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现了我真的想使用的此类:

I found this class that I really want to use:

org.hibernate.action.spi.AfterTransactionCompletionProcess- http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/action/AfterTransactionCompletionProcess.html

org.hibernate.action.spi.AfterTransactionCompletionProcess - http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/action/AfterTransactionCompletionProcess.html

基本上,我希望在提交事务后发生一些自定义逻辑.但是我无法终生想出如何使用这个东西.

Basically, I'd like some custom logic to happen after the transaction is committed. But I cannot for the life of me figure out how to use this thing.

我在哪里指定此接口?任何例子都很棒.

Where do I specify this interface? Any examples would be awesome.

推荐答案

在Hibernate 4.3的单元测试代码库中找到一个示例:

Found an example in the Hibernate 4.3's unit test code base:

org.hibernate.envers.test.integration.basic.RegisterUserEventListenersTest

org.hibernate.envers.test.integration.basic.RegisterUserEventListenersTest

准确显示我在寻找什么:

Shows exactly what I was looking for:

package org.hibernate.envers.test.integration.basic;

import org.hibernate.Session;
import org.hibernate.action.spi.AfterTransactionCompletionProcess;
import org.hibernate.action.spi.BeforeTransactionCompletionProcess;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.envers.internal.tools.MutableInteger;
import org.hibernate.envers.test.BaseEnversFunctionalTestCase;
import org.hibernate.envers.test.entities.StrTestEntity;
import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.event.spi.EventType;
import org.hibernate.event.spi.PostInsertEvent;
import org.hibernate.event.spi.PostInsertEventListener;
import org.hibernate.persister.entity.EntityPersister;

import org.junit.Assert;
import org.junit.Test;

import org.hibernate.testing.TestForIssue;

/**
 * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
 */
public class RegisterUserEventListenersTest extends BaseEnversFunctionalTestCase {
    @Override
    protected Class<?>[] getAnnotatedClasses() {
        return new Class<?>[] {StrTestEntity.class};
    }

    @Test
    @TestForIssue(jiraKey = "HHH-7478")
    public void testTransactionProcessSynchronization() {
        final EventListenerRegistry registry = sessionFactory().getServiceRegistry()
                .getService( EventListenerRegistry.class );
        final CountingPostInsertTransactionBoundaryListener listener = new CountingPostInsertTransactionBoundaryListener();

        registry.getEventListenerGroup( EventType.POST_INSERT ).appendListener( listener );

        Session session = openSession();
        session.getTransaction().begin();
        StrTestEntity entity = new StrTestEntity( "str1" );
        session.save( entity );
        session.getTransaction().commit();
        session.close();

        // Post insert listener invoked three times - before/after insertion of original data,
        // revision entity and audit row.
        Assert.assertEquals( 3, listener.getBeforeCount() );
        Assert.assertEquals( 3, listener.getAfterCount() );
    }

    private static class CountingPostInsertTransactionBoundaryListener implements PostInsertEventListener {
        private final MutableInteger beforeCounter = new MutableInteger();
        private final MutableInteger afterCounter = new MutableInteger();

        @Override
        public void onPostInsert(PostInsertEvent event) {
            event.getSession().getActionQueue().registerProcess(
                    new BeforeTransactionCompletionProcess() {
                        @Override
                        public void doBeforeTransactionCompletion(SessionImplementor session) {
                            beforeCounter.increase();
                        }
                    }
            );
            event.getSession().getActionQueue().registerProcess(
                    new AfterTransactionCompletionProcess() {
                        @Override
                        public void doAfterTransactionCompletion(boolean success, SessionImplementor session) {
                            afterCounter.increase();
                        }
                    }
            );
        }

        @Override
        public boolean requiresPostCommitHanding(EntityPersister persister) {
            return true;
        }

        public int getBeforeCount() {
            return beforeCounter.get();
        }

        public int getAfterCount() {
            return afterCounter.get();
        }
    }
}

这篇关于如何使用org.hibernate.action.spi.AfterTransactionCompletionProcess?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆