2012-04-17 11 views
5

के साथ अपवाद हैंडलिंग मैं कंटेनर-प्रबंधित लेनदेन (जेबॉस एएस 6.1.0.फिनल) के साथ प्रदाता के रूप में हाइबरनेट के साथ जेपीए का उपयोग कर रहा हूं।जेपीए + हाइबरनेट

मैं कुछ ठीक अनाज अपवाद हैंडलिंग को लागू करने की कोशिश कर रहा हूं क्योंकि मेरे पास मेरे ऐप पर एक विशेष अपवाद पदानुक्रम है, इसलिए मैं परिभाषित कर सकता हूं कि हर स्थिति में क्या करना है। इसलिए, मैं घंटों तक जांच कर रहा हूं और मुझे प्रलेखन अस्पष्ट और उदाहरण कुछ हद तक कच्चे हैं क्योंकि अपवाद हैंडलिंग हमेशा "स्पष्टता के लिए" छोड़ी जाती है या एक सरल प्रयास-पकड़ ब्लॉक है जो अपवाद को संभालता है।

उदाहरण के लिए, इस कोड को ले:

public void deleteCompany(ICompany company) throws MyException1, MyException2 { 
    if(entityManager != null){ 
     if(company !=null) { 
      try { 
       ICompany companyReference= entityManager.getReference(Company.class, company.getId()); 
       entityManager.remove(managedCompany); 
       entityManager.flush(); 
      } catch(EntityNotFoundException companyDoesNotExist) { 
       //Wrap & Throw 
      } 
     } else { 
     throw new MyException1("An error occurred while attempting to save a null instance of a company"); 
     } 
    } else { 
     throw new MyException2("The entity manager instance is null"); 
    } 
} 

कैच ब्लॉक खाली है क्योंकि है कि जहां मैं अटक कर रहा हूँ ... मैं नहीं जानता कि जो अपवाद मैं प्रणाली सचेत करने के लिए पकड़ होना चाहिए कि उपयोगकर्ता एक अस्तित्वहीन रिकॉर्ड को हटाने का प्रयास कर रहा था।

मेरा ठोस सवाल यह है: क्या मैं उस पकड़ ब्लॉक पर हाइबरनेट अपवादों को पकड़ सकता हूं या क्या मुझे जेपीए को पकड़ना है? मुझे कुछ स्रोत मिले जो दावा करते हैं कि जेपीए प्रदाताओं के अपवादों को लपेटता है लेकिन यह मेरे लिए अजीब लगता है। मैंने यह भी पाया है कि फ्लश() विधि को कॉल करना डेटाबेस-एक्सेस और हेरफेर अपवादों को पकड़ना संभव बनाता है, क्योंकि लेन-देन कंटेनर द्वारा प्रबंधित किए जाते हैं और इस प्रकार प्रतिबद्धता को हटाने के बाद प्रतिबद्धता आगे बढ़ती है। कॉम्पनी।

धन्यवाद।

संपादित करें: मैं अपने खुद के @ApplicationException (रोलबैक = सच) के साथ एनोटेट अपवादों के साथ अपवाद मैं पकड़ने लपेटकर कर रहा हूँ, इसलिए मैं उन्हें फिर से फेंक और उन्हें और अधिक स्पष्ट रूप से संभाल सकते हैं।

संपादित करें 2: मैंने अपना कोड अपडेट किया है। निकालने से पहले विलय कंपनी को तब तक जारी रखता है जब यह डेटाबेस में नहीं है, जिससे हर बार निष्कासन सफल हो जाता है। अब अपवादों को फेंक दिया जा रहा है और मैं परीक्षण कर रहा हूं कि यह धारणा द्वारा सुझाए गए जेपीए अपवादों को पकड़ने वाली विभिन्न परिस्थितियों में कैसे व्यवहार करता है।

संपादित करें 3: अब यह काम कर रहा है !, यह पता चला कि त्रुटि उस कोड के कारण आंशिक रूप से मेरे कोड में थी। पहले संदर्भ प्राप्त करना और चाल के बाद निकालने का प्रयास करना, इस तरह से मैं EntityNotFoundException को पकड़ने में सक्षम था, इसे लपेटकर इसे फिर से फेंक देता हूं।

उत्तर

5

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

  • IllegalArgumentException - अलग या गैर इकाई वस्तुओं
  • IllegalStateException के लिए - इकाई प्रबंधक
  • PersistenceException बंद कर दिया है - कम से कम, कुछ इसके subclass। आप किन्हीं भी कारणों से के लिए इस प्राप्त कर सकते हैं, अगर वहाँ कोई जुड़े लेन-देन है और लेन-देन बहुत लंबा आदि आदि लेता है, तो कॉल एक, एक डेटाबेस बाधा आपरेशन को खारिज कर दिया है, की आवश्यकता है

आप वास्तव में इन अपवादों को इतने कम स्तर पर नहीं पकड़ना चाहिए, जब तक कि आप किसी प्रकार के कस्टम एप्लिकेशन अपवाद में उन्हें फिर से लपेटने की योजना नहीं बनाते। यदि आप उस मार्ग पर जाने का निर्णय लेते हैं तो मूल अपवाद को लपेटना सुनिश्चित करें, ताकि स्टैक ट्रेस खो न जाए।

यह ध्यान देने योग्य है कि जेपीए इकाई प्रबंधक द्वारा उत्पन्न सभी अपवाद रनटाइम अपवाद हैं।

+0

जो भी आप यहां देते हैं उसे अच्छी तरह से टिप करें, मुझे नहीं पता था कि सभी थीम रनटाइम अपवाद थे, लेकिन कंटेनर-प्रबंधित लेनदेन और संबंधित रोलबैक के बारे में उचित सोच लगती है। मैं उन्हें पकड़ूंगा और उन्हें अपने अपवादों में फिर से फेंकने के लिए लपेटूंगा लेकिन मैं मूल अपवाद भी संरक्षित रखूंगा। सिर्फ एक चीज ... अगर मैं दृढ़ता पकड़ लेता हूं तो क्या मैं विशेष अपवाद निर्धारित करने में सक्षम हूं? या यह पहचान एक बुरा दृष्टिकोण है? – Gamb

+1

आप * विक्रेता अपवाद प्राप्त कर सकते हैं (इसे दृढ़ता अपवाद में 'कारण' के रूप में लपेटा जाएगा), लेकिन कई कारणों से यह एक अच्छा विचार नहीं है। 1) आपको विक्रेता के बारे में परवाह नहीं करना चाहिए, आप अपने कोड को बदले बिना वांछित विक्रेताओं को बदलने में सक्षम होना चाहते हैं। 2) विक्रेता कार्यान्वयन हमेशा अच्छी तरह से प्रलेखित नहीं होते हैं, इसलिए अपवादों का पूरा सेट निर्धारित करने की कोशिश करना व्यर्थता में एक अभ्यास हो सकता है। – Perception

+0

मैं देखता हूं। परेशान करने के लिए खेद है, लेकिन मैं अभी भी यह देखने में असफल रहा हूं कि मैं यह निर्धारित करने में सक्षम हूं कि डेटाबेस में कोई ऑब्जेक्ट संग्रहीत नहीं किया गया था जब मैं इस विधि का आह्वान करता हूं ... मैंने पाया [यह साइट] (http: //www.objectdb .com/api/java/jpa/अपवाद) जो सभी जेपीए अपवादों को सूचीबद्ध करने वाला है और जो मेरी दुविधा फिट करने वाला लगता है वह javax.persistence.EntityNotFuundException है, लेकिन यह स्पष्ट नहीं करता है कि इसे किसी इकाई द्वारा फेंक दिया जाएगा Manager.remove() कॉल ... – Gamb