2016-06-22 8 views
0

В моем проекте Spring загрузки данных/JPA/Hibernate Я настроен следующее CREATE, UPDATE и DELETE слушателей:Hibernate слушателей информация + сделка

@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 
    } 

... 

} 

В моих методах слушателя как onPostInsert, onPostUpdate и т.д. Мне нужно, чтобы получить сделку информацию (например, идентификатор транзакции).

Как это сделать?

ответ

2

Для того, чтобы получить сведения о транзакции любезно использовать код, приведенный ниже, где в случае могут принадлежать PostInsertEvent или PostUpdateEvent

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

 Смежные вопросы

  • Нет связанных вопросов^_^