2016-06-22 11 views
0

In meinem Frühjahr Boot-Daten/JPA/Hibernate Projekt, das ich konfiguriert haben folgende CREATE, UPDATE und DELETE Hörer:Hibernate Hörer + Transaktion info

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

... 

} 

In meiner Zuhörer Methoden wie onPostInsert, onPostUpdate usw. Ich brauche Transaktion zu erhalten Informationen (wie Transaktions-ID).

Wie geht das?

Antwort

2

Um die Transaktionsdetails freundlich zu bekommen den Code unten verwenden, wo in Veranstaltung PostInsertEvent oder PostUpdateEvent

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

Transaktion id bestimmte Datenbank gehören könnte.

Mit PostgreSQL, können Sie einfach diese nativen Abfrage ausführen, um die aktuelle Transaktions-ID zu erhalten:

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

Für MySQL, müssen Sie 5.7 oder höher ausgeführt wird:

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(); 

oder für 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

Danke! Ist es möglich, zusätzliche Abfragen an die Datenbank zu vermeiden? Ich brauche einige Identifikatoren, um alle Änderungen in Revisionen zu organisieren (aus derselben Transaktion) – alexanoid