2016-06-22 77 views
0

在我的春節,引導數據/ 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)。

怎麼辦?

回答

2

爲了獲得交易詳情敬請使用下面的代碼,其中在事件可能屬於PostInsertEventPostUpdateEvent

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

交易編號爲特定的數據庫。

在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(); 
+0

謝謝!是否有可能避免額外的數據庫查詢?我需要獲得一些標識符,以便將所有更改組織到修訂中(來自同一事務) – alexanoid