首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate监听器+事务信息

Hibernate监听器+事务信息
EN

Stack Overflow用户
提问于 2016-06-22 08:42:26
回答 1查看 1.3K关注 0票数 1

在我的Spring /JPA/Hibernate项目中,我配置了以下创建、更新和删除侦听器:

代码语言:javascript
复制
@Component
public class HibernateListenersConfigurer {

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Autowired
    private HibernateEntityListener listener;

    @PostConstruct
    public void registerListeners() {
        final HibernateEntityManagerFactory hibernateEntityManagerFactory = (HibernateEntityManagerFactory) this.entityManagerFactory;
        final SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl) hibernateEntityManagerFactory.getSessionFactory();
        final EventListenerRegistry registry = sessionFactoryImpl.getServiceRegistry().getService(EventListenerRegistry.class);

        registry.getEventListenerGroup(EventType.POST_COMMIT_INSERT).appendListener(listener);
        registry.getEventListenerGroup(EventType.POST_COMMIT_UPDATE).appendListener(listener);
        registry.getEventListenerGroup(EventType.POST_DELETE).appendListener(listener);
    }

}


@Component
public class HibernateEntityListener implements PostCommitInsertEventListener, PostCommitUpdateEventListener, PostCommitDeleteEventListener {

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

    @Override
    public void onPostInsert(PostInsertEvent event) {
        //get transaction information(like ID) here
    }

...

}

在侦听器方法(如onPostInsertonPostUpdate等)中,我需要获取事务信息(比如事务ID)。

怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-22 08:58:29

为了获得事务的详细信息,请使用下面的代码,在事件发生时,代码可以属于PostInsertEventPostUpdateEvent

代码语言:javascript
复制
session = event.getPersister().getFactory().getCurrentSession();
Transaction transaction = session.getTransaction();

事务id是特定于数据库的。

使用PostgreSQL,您可以简单地运行这个本机查询来获取当前事务id:

代码语言:javascript
复制
Number transactionId = (Number) session
   .createSQLQuery("select txid_current()")
   .uniqueResult();

对于MySQL,需要运行5.7或更高版本:

代码语言:javascript
复制
Number transactionId = (Number) session
   .createSQLQuery(
            "SELECT GTID " +
            "FROM events_transactions_current e " +
            "JOIN performance_schema.threads t ON e.THREAD_ID = t.THREAD_ID " +
            "WHERE t.PROCESSLIST_ID = CONNECTION_ID()")
   .uniqueResult();

或适用于MySQL 5.5:

代码语言:javascript
复制
Number transactionId = (Number) session
   .createSQLQuery(
            "SELECT trx_id " +
            "FROM information_schema.innodb_trx " +
            "WHERE trx_mysql_thread_id = CONNECTION_ID()")
   .uniqueResult();
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37962830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档