Hibernate监听器+事务信息

时间:2016-06-22 08:42:27

标签: spring hibernate jpa spring-data-jpa

在我的Spring Boot Data / JPA / Hibernate项目中,我配置了以下CREATE,UPDATE和DELETE监听器:

@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)。

怎么做?

1 个答案:

答案 0 :(得分:2)

为了获取交易详情,请使用以下代码,其中事件可能属于PostInsertEventPostUpdateEvent

session = event.getPersister().getFactory().getCurrentSession();
Transaction transaction = session.getTransaction();

交易ID是特定于数据库的。

使用PostgreSQL,您只需运行此本机查询即可获取当前的事务ID:

Number transactionId = (Number) session
   .createSQLQuery("select txid_current()")
   .uniqueResult();

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

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:

Number transactionId = (Number) session
   .createSQLQuery(
            "SELECT trx_id " +
            "FROM information_schema.innodb_trx " +
            "WHERE trx_mysql_thread_id = CONNECTION_ID()")
   .uniqueResult();
相关问题