जहां "@ ट्रेंसेक्शनल" होना चाहिए सेवा लेयर या डीएओ


81

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

नियंत्रक-> प्रबंधक-> दाओ-> ओरम।

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

मुझे कौन सी परत बदलनी चाहिए। मेरा मानना ​​है कि यह DAO होना चाहिए जो मुझे वेब सेवा से डेटा प्राप्त कर रहा है और इसे वापस भेज रहा है। दो अलग-अलग लिखित DAO परतों और परिदृश्य के आधार पर प्लग किया गया है।

मुझे अब एहसास हुआ है कि जब हम @Transactionalसर्विस लेयर में होते हैं तो हम टाइट कपलिंग कर रहे होते हैं (अगर ऐसी कोई बात हो या ढीली कपलिंग न हो) । इतने सारे दिमाग गलत नहीं हो सकते हैं या वे (मुझे संदेह है)।

तो सवाल यह है कि "कहां होना चाहिए" @Transactionalसेवा लेयर या डीएओ होना चाहिए ? और क्या यह सेवा की परत नीचे की ओर है जिसे मुझे प्रतिस्थापित किया जाना चाहिए।


जवाबों:


81

आदर्श रूप से, सेवा परत ( प्रबंधक ) आपके व्यावसायिक तर्क का प्रतिनिधित्व करता है और इसलिए इसे एनोटेट किया जाना चाहिए @Transactional

डीबी संचालन करने के लिए सेवा परत अलग-अलग डीएओ को बुला सकती है। चलो एक ऐसी स्थिति मानें जहां आपके पास सेवा पद्धति में 3 डीएओ संचालन हैं। यदि आपका पहला DAO ऑपरेशन विफल हो गया, तो अन्य दो अभी भी पारित हो सकते हैं और आप असंगत DB स्थिति के साथ समाप्त हो जाएंगे। एनोटेटिंग सेवा की परत आपको ऐसी स्थितियों से बचा सकती है।


आपके जवाब के लिए धन्यवाद। क्या आप उस वर्ष का उल्लेख कर सकते हैं जिसका आपने उत्तर दिया था? मानो या न मानो, आप बस समय मशीन के अस्तित्व को साबित कर सकते हैं। 2015 में आपने +1 किया
शहज़ेब

मैंने उस साल तक ध्यान नहीं दिया जब तक आपने :)
बादल

60

आप अपनी सेवाओं का लेन-देन करना चाहते हैं। यदि आपके DAO ट्रांजेक्शनल हैं, और आप प्रत्येक सेवा में अलग-अलग DAO कहते हैं, तो आपके पास कई लेनदेन होंगे, जो कि आप नहीं चाहते हैं। सेवा कॉल को लेन-देन करें, और उन विधियों के अंदर सभी DAO कॉल विधि के लिए लेनदेन में भाग लेंगे।


6
क्या वह अपने @Transactionएनोटेशन पर एक प्रचार पद्धति को निर्दिष्ट नहीं कर सकता है , ताकि केवल 1 लेनदेन का उपयोग किया जाए, क्योंकि यह यहां
Fotis Paraskevopoulos

1
@FotisParaskevopoulos यह केवल काम करेगा वह है अगर @Transactionalपर दोनों सेवा और डीएओ। फिर अतिरिक्त एनोटेशन चोट नहीं पहुंचाएगा, लेकिन या तो मदद नहीं करेगा।
विलियम एफ। जेम्सन

6

मैं सेवा परत विधियों में @Transactional लगाने का सुझाव दूंगा क्योंकि हमारे पास कई DAO कार्यान्वयन हो सकते हैं। इसका उपयोग करके हम अपनी सेवाओं को लेन-देन योग्य बना सकते हैं। उल्लेख

सबसे अच्छा अभ्यास आम सेवाओं की पेशकश करने के लिए एक सामान्य बेसिक सेवा का उपयोग करना है।

यह सेवा @ स्थानापन्न के लिए सबसे अच्छी जगह है, सेवा परत को उपयोगकर्ता के इंटरैक्शन के लिए विस्तार-स्तरीय उपयोग के मामले का व्यवहार रखना चाहिए जो तार्किक रूप से लेनदेन में जाना चाहिए। इस तरह हम वेब एप्लिकेशन कोड और व्यावसायिक तर्क के बीच अलगाव को बनाए रख सकते हैं।

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

तो व्यवहार में आप उन्हें किसी भी स्थान पर रख सकते हैं, यह आपके ऊपर है।

आपकी सेवा में कई कॉल करने से आपको सेवा में @ ट्रेंसेक्शनल की आवश्यकता होती है। सेवा में अलग-अलग कॉल अलग-अलग लेन-देन में निष्पादित होंगे यदि आप सेवा में @ ट्रेंसेक्शनल को डालते हैं।


0

यह एप्लीकेशन के प्रकारों के आधार पर एक व्यक्तिगत पसंद है, यदि आवेदन कई मॉड्यूलों में लेयर है और अधिकांश ऑपरेशंस @CRUD आधारित हैं, तो सेवा स्तर पर @transactional एनोटेशन होने से अधिक सेंस बनता है .. इंजन प्रकार एप्लिकेशन जैसे शेड्यूलर, जॉब सर्वर, @ etl रिपोर्ट एप्स, जहां सत्र और उपयोगकर्ता अवधारणा मौजूद नहीं है, तो संदर्भ स्तर पर प्रचार लेनदेन सबसे उपयुक्त है ... हमें @transactional को हर जगह जहां लेन-देन विरोधी पेटेंट को समाप्त करके क्लस्टर लेनदेन का निर्माण नहीं करना चाहिए ... व्यावहारिक लेनदेन के लिए वैसे भी नियंत्रण JTA2 सबसे उपयुक्त उत्तर है ... फिर से यह मौसम पर निर्भर करता है कि आप इसे दी गई स्थितियों में उपयोग कर सकते हैं ...


0

आपको सर्विस लेयर पर @ ट्रेंसेक्शनल का उपयोग करना चाहिए, यदि आप क्लाइंट B के लिए डोमेन मॉडल बदलना चाहते हैं, जहाँ आपको एक अलग मॉडल में समान डेटा प्रदान करना है, तो आप DAO परत को अलग सेवा प्रदान किए बिना डोमेन मॉडल को बदल सकते हैं या एक इंटरफेस बनाकर और अलग-अलग मॉडल में इंटरफ़ेस को लागू करने और एक ही सेवा के साथ क्लाइंट के आधार पर मॉडल को पॉप्युलेट करें। यह निर्णय व्यावसायिक आवश्यकता और परियोजना के दायरे पर आधारित है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.