2010-09-16 13 views
5

मेरे पास कंटेनर प्रबंधित लेनदेन का उपयोग करते हुए @WebService इंटरफेस के साथ @Stateless ईजेबी है, जिसका मतलब है कि एक सिस्टम को अपवाद नहीं फेंकने के बाद लेनदेन स्वचालित रूप से कंटेनर द्वारा किया जाता है।मैं कंटेनर प्रबंधित लेनदेन प्रतिबद्धता से अपवाद कैसे प्राप्त करूं?

यदि मैं EntityManager.persist(...) पर दो ऑब्जेक्ट्स को एक कॉलम के लिए एक समान मूल्य वाले कॉलम के लिए प्रयास करता हूं, तो कंटेनर मेरे कोड के बाहर प्रतिबद्ध होने पर क्लाइंट को PersistenceException फेंक देगा। मैं इस अपवाद को कैसे पकड़ूं ताकि मैं अपना स्वयं का एप्लिकेशन अपवाद दोबारा कर सकूं?

क्या मुझे प्रतिबद्धता पर अपवादों को पकड़ने के लिए अपने तरीकों से मैन्युअल रूप से लेनदेन करना है? (और EntityManager.flush() ऐसा करने का सही तरीका है?) यदि हां, तो कंटेनर प्रबंधित लेन-देन करने का क्या मतलब है?

उत्तर

3

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

+2

उत्तर देने के लिए धन्यवाद। मैंने 'EntityManager.flush()' को '@roundInvoke' इंटरसेप्टर में करके हल किया। –

+1

यह कभी-कभी काम कर सकता है, लेकिन अलगाव स्तर से सावधान रहें। जब तक आप सबकुछ क्रमबद्ध नहीं करते हैं, तब भी टीएक्स काम करते समय असफलताओं को प्राप्त करना संभव है। –

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