2013-07-17 6 views
5

Meine Anforderung ist, ich möchte eine Datenbankoperation durchführen. Also, ich tue ...Wie überprüft man, ob die Sitzung bereits eine Transaktion geöffnet hat oder nicht im Ruhezustand?

Public boolean myFunction(){ 
    Session session = sessionFactory.getCurrentSession(); 
    if(session!=null){ 
     if (tx != null) { 
      Transaction tx = session.beginTransaction(); 
      //Perform database operation... 
      tx.rollback(); 
      if (session.isOpen()) { 
      session.close(); 
      } 
      tx = null; 
      session = null; 
     } 
    }else{ 
     return; 
    } 
} 

Das funktioniert gut, wenn meine Sitzung keine zuvor Uncommited/unrolledback tranasction enthält.

Nun Problem Sceanario hier ist ...

Sceanario:

gibt es einen Service ... die myFunction() aufgerufen und dieser Dienst hat bereits eine aktive Transaktion in der Sitzung.

Problem: Wenn myfunction() tx.rollback() ausführt ... rollte es die Transaktion des übergeordneten Elements zurück.

1.) Why this happen??? 
2.) Is there nay way to determine... weather hibernate session contains any previous open/uncommited/active/unrolledback/continue transaction? 

ich versucht habe ...

Public boolean myFunction(){ 
    Session session = sessionFactory.getCurrentSession(); 
    if(session!=null){ 
     if (tx != null) { 
      boolean isAlreadyTransactionStarted = sessionFactory.getCurrentSession().getTransaction().isActive(); 
      if(isAlreadyTransactionStarted){ 
       Transaction tx = sessionFactory.getCurrentSession().getTransaction(); 
      }else{ 
       Transaction tx = session.beginTransaction(); 
      } 
      //Perform database operation... 
      if(isAlreadyTransactionStarted){ 
       tx.rollback(); 
       if (session.isOpen()) { 
       session.close(); 
       } 
       tx = null; 
       session = null; 
      }else{ 
       //Nothing to do... 
      } 
     } 
    }else{ 
     return; 
    } 
} 

aber im Fall

1.) When parent call contains any active transactions then isAlreadyTransactionStarted becomes true. 

2.) But in the case call which does not contains any transaction, also isAlreadyTransactionStarted becomes true. 

Meine Frage noch gleich ist:

Gibt es ja Art und Weise zu bestimmen .. window hibernate session enthält alle vorherigen open/uncommited/active/entrollt/continue transaction?

Antwort

1

Können Sie Session.isDirty() verwenden?

+0

es gibt mir eine Ausnahme: org.hibernate.HibernateException: isDirty ist nicht gültig ohne aktive Transaktion –

+0

Nun ... da gehst du :) Jetzt wissen Sie, es gibt keine Transaktion .... Aber im Ernst, vielleicht können Sie es nennen nachdem Sie sessionFactory.getCurrentSession() aufgerufen haben. getTransaction(). Sie werden also immer eine Transaktion aktiv haben, aber die Sitzung ist möglicherweise nicht immer schmutzig. – Nicholas

Verwandte Themen