2012-03-15 15 views
9

मैं हाइबरनेट के लिए नया हूं।org.hibernate.HibernateException: सक्रिय लेनदेन के बिना प्राप्त मान्य नहीं है

  • स्वचालित रूप से निर्मित hibernate.cfg.xml (Netbeans जादूगर)
  • स्वचालित रूप से HibernateUtil.java
  • बनाया
  • एनोटेशन

डेटाबेस लेकिन हो रही त्रुटि से वस्तु प्राप्त करने के लिए कोशिश कर रहा है के साथ स्वचालित रूप से निर्मित POJO वर्ग:

Exception in thread "pool-1-thread-1" org.hibernate.HibernateException: get is not valid without active transaction 
    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:297) 

कोई ऑब्जेक्ट प्राप्त करना:

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
CallInfo ci = (CallInfo) session.get(CallInfo.class, ucid); 

hibernate.cfg.xml

<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:3306/sochi_feedback</property> 
<property name="hibernate.connection.username">root</property> 
<property name="hibernate.connection.password">root</property> 
<property name="hibernate.show_sql">true</property> 
<property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property> 
<property name="hibernate.current_session_context_class">thread</property> 
+0

क्या आप कृपया कोड जोड़ सकते हैं जो get() विधि को कॉल करता है ?? –

+0

@ShashankKadne 'CallInfo ci = (CallInfo) session.get (CallInfo.class, ucid);' – VextoR

+1

"लेनदेन tx = session.beginTransaction();" जोड़ें इस लाइन से पहले और अपने परिचालन के अंत में "tx.commit();" –

उत्तर

14

जोड़े

Transaction tx = session.beginTransaction(); // यह बयान सिर्फ अपने CallInfo ci = (CallInfo) session.get(CallInfo.class, ucid);

से पहले और के अंत में लेन-देन

आरंभ हो जाएगा अपने लेनदेन कॉल करके परिवर्तन प्रतिबद्ध करता है ..

tx.commit(); 
+3

क्यों ग्रहण हाइबरनेट उपकरण स्वचालित रूप से उत्पन्न नहीं करता है? –

3

एक अन्य समाधान openSession() बजाय getCurrentSession() उपयोग करने के लिए है। फिर लेन-देन केवल तभी उपयोग किए जा सकते हैं जब प्रश्नों को अपडेट करने के लिए आवश्यक हो। beginTransaction()

Session session = HibernateUtil.getSessionFactory().openSession(); 
CallInfo ci = (CallInfo) session.get(CallInfo.class, ucid); 
+0

मुझे यह बिल्कुल अनुभव हो रहा है, यानी getCurrentSession के माध्यम से प्राप्त सत्रों को प्राप्त करने के लिए भी एक लेनदेन की आवश्यकता होती है, जबकि यह ओपन सत्र का उपयोग करते समय लागू नहीं होता है। ऐसा क्यों है? (मैंने सोचा था कि सत्र-वस्तुएं समान हैं?) –

+0

मुझे एक ही समस्या थी। पर क्यों? –

0

के बाद भी और और commit() अगर आप अभी भी मिल

Caused by: org.hibernate.HibernateException: setDefaultReadOnly is not valid without active transaction 
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352) 

सेवाओं के लिए खोज और डेटाबेस सेवा

0

पुनः आरंभ इससे पहले कि आप वास्तव में इस लेनदेन शुरू जाना "प्रारंभ" और आप सत्रफैक्टरी बनाने के ठीक बाद पर कॉल करके सत्र शुरू करने की आवश्यकता है।

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