2012-06-06 13 views
5

से बचें मैं हाइबरनेट में नौसिखिया हूं।हाइबरनेट में org.hibernate.TransactionException क्यों और

मैंने mysql डेटाबेस सर्वर में डेटा डालने के लिए एक छोटे प्रोग्राम को कोड करने का प्रयास किया है।

private int insertRelateNew(int newId, List<DocSimilar> relateNews) { 
    Session session = HibernateUtils.currentSession(); 
    Transaction tx = session.beginTransaction(); 
    RelatedArticles relatedArticles = null; 
    try { 
     relatedArticles = new RelatedArticles(); 
     for (DocSimilar doc : relateNews) { 
      ApplicationPK appPK = new ApplicationPK(newId, 
        (int) doc.getDocid()); 
      relatedArticles.setApplicationPK(appPK); 
      relatedArticles.setRelated_score(doc.getPercent()); 
      session.save(relatedArticles); 
      tx.commit(); 
      session.flush(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     tx.rollback(); 
    } 
    return newId; 
} 

जब चल रहा है, यह सफल डालने लेकिन कुछ समय यह एक TransactionException फेंक:

यह मेरा कार्यक्रम के स्रोत कोड है।

org.hibernate.TransactionException: Transaction not successfully started 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:131) 
    at com.ant.crawler.dao.hibernate.SqlNewsPersistencer.insertRelateNew(SqlNewsPersistencer.java:56) 
    at com.ant.crawler.dao.hibernate.SqlNewsPersistencer.insertNews(SqlNewsPersistencer.java:40) 
    at com.ant.crawler.dao.hibernate.SqlPersistencer.store(SqlPersistencer.java:44) 
    at com.ant.crawler.core.AbstractCrawler.crawl(AbstractCrawler.java:186) 
    at com.ant.crawler.core.Worker.run(Worker.java:14) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 

मैं इस समस्या, किसी को सलाह दी पकड़ अपवाद और रोलबैक() की खोज:

यह अपवाद कंसोल है।

लेकिन इस तरह से रिकॉर्ड खो सकता है जिसे मैं डीबी में डालना चाहता हूं।

मुझे पता है कि इसे टालने के लिए अपवाद क्यों होता है। http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/TransactionException.html

यह कहा:

मैं हाइबरनेट जावा डॉक्टर में अपवाद की खोज "। यह बताता है कि लेन-देन, शुरू नहीं किया जा सकता है प्रतिबद्ध या वापस लुढ़का"

यह स्पष्ट नहीं करता कि अपवाद क्यों होता है।

कृपया मुझे बताएं कि अपवाद क्यों होता है और इससे कैसे बचें।

बहुत बहुत धन्यवाद।

+0

क्या आप किसी भी लॉगिंग एपीआई का उपयोग करते हैं? 'Org.hibernate.transaction' लॉगर्स सक्षम करें और विश्लेषण के लिए लॉग प्राप्त करें। –

उत्तर

4

स्पष्टीकरण आसान है: आप एक सौदे केवल एक बार शुरू करते हैं, लेकिन यह वादा कई बार:

Transaction tx = session.beginTransaction(); 
... 
for (DocSimilar doc : relateNews) { 
    ... 
    tx.commit(); 
} 

या तो आप प्रत्येक दस्तावेज़ के लिए एक अलग लेन-देन चाहते हैं, और लेन-देन के लिए लूप के अंदर शुरू होगा, या आप सभी दस्तावेज़ों के लिए एक ही लेनदेन चाहते हैं, और प्रतिबद्धता लूप के बाहर होना चाहिए।

+2

बिल्कुल जेबी निजेट। बहुत बहुत धन्यवाद। मैंने अभी इसे ठीक कर दिया है। – tienthanhakay

2

मुझे आपके जैसा ही त्रुटि संदेश था, मैंने पाया कि रोलबैक भी आपको एक समस्या दे सकता है।

मेरे मामले में, जब मैं "tx.rollback()" कहता हूं, तो यह मुझे त्रुटि से ऊपर फेंकता है "org.hibernate.TransactionException: लेनदेन सफलतापूर्वक प्रारंभ नहीं हुआ"।

तो मैं जब एहसास हुआ कि, मैं निम्नलिखित जोड़ा ...

if (tx!=null && tx.isActive()) { 
tx.rollback(); 
} 

तो यह मुझे एक और अपवाद है, जो अब बेहतर है का पता चलता है, अब की वजह से मैं देख सकता हूँ जहाँ है वास्तविक समस्या है, इसमें कुछ मापदंड है मेरी डालने मैं पूरा नहीं कर रहा हूं ...

उम्मीद है कि यह मदद करता है, चीयर्स।

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