2011-09-02 9 views
20

मैं बैक-एंड के लिए हाइबरनेट का उपयोग करके स्विंग में लिखा गया एक व्यवसाय प्रोजेक्ट लिख रहा हूं। मैं वसंत से आया हूं, जिसने मुझे हाइबरनेट और लेनदेन का उपयोग करने के आसान तरीके दिए हैं। वैसे भी मैं हाइबरनेट काम कर रहा था। कल, जबकि डीबी से एक सेम नष्ट करने के लिए कुछ कोड लिखने, मैं यह मिल गया:मुझे org.hibernate क्यों मिलता है। हाइबरनेट अपवाद: कोई CurrentSessionContext कॉन्फ़िगर नहीं

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions 

विलोपन कोड बस है:

Session sess = HibernateUtil.getSession(); 
    Transaction tx = sess.beginTransaction(); 
    try { 
     tx.begin(); 
     sess.delete(ims); 
    } catch (Exception e) { 
     tx.rollback(); 
     throw e; 
    } 
    tx.commit(); 
    sess.flush(); 

और मेरे HibernateUtil.getSession() है:

public static Session getSession() throws HibernateException { 
     Session sess = null; 
     try { 
      sess = sessionFactory.getCurrentSession(); 
     } catch (org.hibernate.HibernateException he) { 
      sess = sessionFactory.openSession(); 
     } 
     return sess; 
    } 

अतिरिक्त विवरण: मैं अपने कोड में केवल हाइबरनेट सत्र बंद नहीं करता हूं, बस आवेदन बंद होने पर। क्या यह गलत है? मैं इसे हटाने पर क्यों प्राप्त करूं (केवल उस बीन के लिए, अन्य काम करते हैं), और मैं अन्य परिचालनों (सम्मिलित, क्वेरी, अद्यतन) पर नहीं हूं?

मैं चारों ओर पढ़ सकते हैं और मैं बस एक sessionFactory.getCurrentSessionCall() में मेरी getSession विधि को संशोधित करने की कोशिश की, लेकिन मैं मिल गया: org.hibernate.HibernateException: No CurrentSessionContext configured!

Hibernat conf:

<hibernate-configuration> 
    <session-factory > 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost/joptel</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.connection.password">******</property> 
    <property name="hibernate.connection.pool_size">1</property> 
    <property name="show_sql">true</property> 
    <property name="hibernate.hbm2ddl.auto">update</property> 


    ..mappings.. 

    </session-factory> 
</hibernate-configuration> 
+0

आपकी हाइबरनेट कॉन्फ़िगरेशन फ़ाइल कैसा दिखती है? – Santosh

उत्तर

54

मैं तुम्हें एक बात पूछना चाहते हैं, तो आप क्यों कर रहे हैं "ओपन सत्र" विधि का उपयोग करने की कोशिश कर रहा है?

public static Session getSession() throws HibernateException {   
    Session sess = null;  
    try {   
     sess = sessionFactory.getCurrentSession(); 
    } catch (org.hibernate.HibernateException he) { 
     sess = sessionFactory.openSession();  
    }    
    return sess; 
} 

आप openSession() कॉल करने के लिए getCurrentSession() विधि हमेशा होता है क्योंकि (इस मामले में धागा यदि आप होने के लिए कॉन्फ़िगर कर लेने) वर्तमान सत्र रिटर्न नहीं है।

मुझे मिल गया ... आप अपने hibernate.cfg.xml फ़ाइल में वर्तमान संदर्भ में बताने की

यह होना चाहिए:

<property name="hibernate.current_session_context_class">thread</property> 
10

नहीं CurrentSessionContext कॉन्फ़िगर किया गया

Contextual Sessions पर संदर्भ मार्गदर्शिका पढ़ें। इसके लिए आपको configure some provided or custom strategy की आवश्यकता है। एक hibernate.cfg.xml में, आप इसे

<property name="hibernate.current_session_context_class">...</property> 

आप शायद प्रति-धागा सत्र पाने के लिए मूल्य के रूप में "सूत्र" का उपयोग करना चाहते हैं, उससे कॉन्फ़िगर चाहते हैं। वसंत का उपयोग करते समय, यह स्वचालित रूप से इसे SpringSessionContext पर सेट करता है, जिससे स्प्रिंग आसानी से हाइबरनेट को अपने लेनदेन प्रबंधन ढांचे के साथ एकीकृत करने की अनुमति देता है।

मैं वसंत से आया हूं, जिसने मुझे हाइबरनेट और लेनदेन का उपयोग करने के आसान तरीके दिए।

यदि आप वसंत से परिचित हैं, तो आप यहां हाइबरनेट का प्रबंधन करने के लिए इसका उपयोग क्यों नहीं कर रहे हैं? आपको पहले ही पता होना चाहिए कि यह कितना सरल और मूर्खतापूर्ण बनाता है।

मैं अपने कोड में केवल हाइबरनेट सत्र बंद नहीं करता, केवल आवेदन बंद होने पर। क्या यह गलत है?

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

अवैध दो खुले सत्र

के साथ एक संग्रह संबद्ध करने के लिए इसका मतलब है कि यह वास्तव में क्या कहते हैं प्रयास। आपने कुछ दृढ़ता संचालन करने की कोशिश की है (सहेजें(), अद्यतन(), हटाएं()) जो कि किसी भिन्न सत्र से पहले से जुड़ा हुआ था। जब भी आप यादृच्छिक रूप से नए सत्र खोलते हैं तो यही होगा, जो तब हो रहा है जब सत्र Factory.getCurrentSession() हमेशा विफल रहेगा जब कोई "वर्तमान सत्र संदर्भ" सेट नहीं होता है। आम तौर पर, कभी एक सत्र खोलें क्योंकि केवल पहले से ही नहीं था। सत्रों को खोलने और बंद करने के लिए आपको अच्छी तरह से परिभाषित रणनीतियों की आवश्यकता है और इन "रणनीतियों" के बाहर किसी भी सत्र को कभी भी खोलने की आवश्यकता नहीं है। यह संसाधन लीक और आपके द्वारा सामना की जाने वाली त्रुटियों के लिए एक निश्चित मार्ग है।

3

मुझे एक ही समस्या का सामना करना पड़ा जब मैं पोर्टल पर काम कर रहा हूं जहां मैं हाइबरनेट के साथ वसंत रिमोटिंग का उपयोग कर रहा हूं। इस तरह की समस्या तब उत्पन्न होती है जब कॉल की गई सेवा विधि में कई डीएओ कॉल होते हैं जो हाइबरनेट सत्र के साथ डेटाबेस हिट करते हैं।

और समाधान कई डीएओ कॉल के साथ उन विधियों के लिए @ ट्रान्सएक्शन एनोटेशन सेट किया गया है। (इस विधि में सभी डीओए कॉल के साथ एक लेनदेन के तहत होना चाहिए।)

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