2013-07-17 4 views
5

मेरे आवश्यकता मैं एक डेटाबेस कार्रवाई करने के लिए चाहते हैं। तो, मैं कर रहा हूँ ...कैसे है कि क्या सत्र पहले से ही खुला लेन-देन हुआ है या नहीं हाइबरनेट में जांच करने के लिए?

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

यह अच्छा काम करता है जब मेरी सत्र को किसी भी पुरानी uncommited/unrolledback tranasction शामिल नहीं है।

अब, समस्या Sceanario यहाँ है ...

Sceanario:

वहाँ एक सेवा है ... जो myfunction कहा जाता है() है और वह सेवा सत्र में पहले से ही एक सक्रिय लेन-देन हुआ।

समस्या: जब myfunction() tx.rollback() निष्पादित करता है ... यह भी माता-पिता के लेन-देन को वापस ले जाता है।

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

मैंने कोशिश की है ...

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

लेकिन मामले

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. 

मेरा प्रश्न अभी भी वही है में:

यह तय करने के अस्वीकार रास्ता नहीं है .. । मौसम हाइबरनेट सत्र किसी भी पिछले खुला/uncommited/सक्रिय/unrolledback/जारी रखने के लिए लेन-देन होता है?

उत्तर

1

आप उपयोग कर सकते हैं Session.isDirty()?

+0

यह मुझे एक अपवाद देता है: org.hibernate.HibernateException: isDirty सक्रिय लेनदेन के बिना मान्य नहीं है –

+0

अच्छा ... वहां आप जाते हैं :) अब आप जानते हैं कि कोई लेनदेन नहीं है .... लेकिन गंभीरता से, शायद आप इसे कॉल कर सकते हैं तुम्हारे जाने के बाद sessionFactory.getCurrentSession()। getTransaction फोन()। तो आप हमेशा एक सौदे सक्रिय होंगे, लेकिन सत्र हमेशा गंदा नहीं हो सकता। – Nicholas

संबंधित मुद्दे

 संबंधित मुद्दे