2014-10-15 6 views
57

मुझे समझ में नहीं आता एनोटेशन javax.transaction.Transactional और org.springframework.transaction.annotation.Transactional के बीच वास्तविक अंतर क्या है?javax.transaction.Transactional बनाम org.springframework.transaction.annotation.Transactional

org.springframework.transaction.annotation.Transactionaljavax.transaction.Transactional का विस्तार है या उनके पास पूरी तरह से अलग अर्थ है? उनमें से प्रत्येक को कब इस्तेमाल किया जाना चाहिए? सेवा परत में @Transactinal और डीएओ में जैवैक्स?

उत्तर देने के लिए धन्यवाद।

उत्तर

54

वसंत ने साल पहले स्प्रिंग बीन विधियों को लेनदेन करने के लिए अपनी लेनदेन संबंधी एनोटेशन परिभाषित की है।

जावा ईई 7 ने आखिरकार वही काम किया है और अब सीजीआई बीन विधियों को लेनदेन के लिए अनुमति देता है, ईजेबी विधियों के अतिरिक्त। इसलिए जावा ईई 7 के बाद से, यह अपने लेनदेन संबंधी एनोटेशन को भी परिभाषित करता है (यह स्पष्ट रूप से स्प्रिंग वन का पुन: उपयोग नहीं कर सकता है)।

जावा ईई 7 एप्लिकेशन में, आप जावा ईई एनोटेशन का उपयोग करेंगे।

एक वसंत आवेदन में, आप वसंत एनोटेशन का उपयोग करेंगे।

उनका उपयोग समान है: कंटेनर (जावा ईई या स्प्रिंग) को सूचित करना कि एक विधि लेनदेन है।

+4

इससे अधिक: ब्रह्मांड पर शासन करने के लिए, वसंत ने 'javax.transaction.Transactional' के लिए भी निहित समर्थन जोड़ा। इसलिए अब कोई भी अतिरिक्त क्रियाओं के बिना वसंत अनुप्रयोगों में इसका उपयोग कर सकता है। आईएमओ, ** यह डिज़ाइन स्टैंडपॉइंट ** से काफी खराब निर्णय था, क्योंकि मेरे अनुभव से बहुत सारे डेवलपर्स इन दोनों को अपने कोड में अनजाने में भ्रमित करते हैं जो बाद में समस्याओं का कारण बनता है। – Yura

+1

इसके अलावा, 'org.springframework.transaction.annotation.Transactional' 'javax' से अधिक विकल्प प्रदान करता है (जैसे' readOnly', 'timeout')।लेनदेन। लेनदेन ' – pierrefevrier

+0

@ युरा, आपने क्या समस्याएं देखी हैं? –

17

कृपया सावधान, (इस मुद्दे बिल्ला में हुआ) हो,

यदि आपका आवेदन वसंत वेब अनुप्रयोग है और आप स्प्रिंग के लेन-देन तंत्र कि है @org.springframework.transaction.annotation.Transactional से निपटने का उपयोग कर रहे हैं, तो javax.transaction के साथ मिला नहीं है। लेन-देन की।

यह हमेशा वसंत आवेदन में @org.springframework.transaction.annotation.Transactional का उपयोग करता है।

अन्यथा हम इस त्रुटि के साथ खत्म हो सकता है,

org.springframework.orm.jpa.JpaSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed 

........ 

Caused by: java.sql.SQLException: Protocol violation: [0] 
+0

से नीचे दो उत्तरों देखें नोट: यह उत्तर मेरे उत्तर का एक विशेष मामला है – Jidehem

28

एक और अंतर यह कैसे स्प्रिंग @Transactional एनोटेशन

  • org.springframework.transaction.annotation.Transactional हमेशा लिया जाता है संभालती है खाते में
  • javax.transaction.Transactional केवल तभी लिया जाता है जब ईजेबी 3 लेनदेन फिर से उपस्थित ईजेबी 3 लेन-देन की उपस्थिति यह जांचकर की जाती है कि कक्षा javax.ejb.TransactionAttribute क्लासपाथ में उपलब्ध है (संस्करण 2.5.3 से 3.2.5 तक)। इस प्रकार आप अपने एनोटेशन को समाप्त नहीं कर सकते हैं यदि खाते में नहीं लिया जा रहा है यदि केवल javax.transaction.Transactional आपके क्लासपाथ में है और javax.ejb.TransactionAttribute नहीं है। यदि आप हाइबरनेट के साथ काम कर रहे हैं तो यह मामला हो सकता है: हाइबरनेट-कोर (4.3.7. फ़ाइनल) jboss-credit-api_1.2_spec (1.0.0.Final) पर निर्भर करता है, जो javax.ejb.TransactionAttribute प्रदान नहीं करता है।
+3

मुझे लगता है कि यह अब स्प्रिंग 4.2.0 के साथ कोई मुद्दा नहीं है: [javax.transaction.Transactional एनोटेशन को ड्रॉप-इन के रूप में भी समर्थित किया जाता है स्प्रिंग की अपनी एनोटेशन के प्रतिस्थापन] (http://docs.spring.io/spring/docs/4.2.0.RELEASE/spring-framework-reference/html/transaction.html#transaction-declarative-annotations) –

+0

इसे हमेशा नहीं लिया जाता है , अगर यह एक निजी विधि पर उदाहरण के लिए नहीं लिया जाएगा। – strash

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