20

मैं समान सवालों और चिंताओं पड़ा है हाइबरनेट संस्थाओं और डेटा स्थानांतरण के बीच परिवर्तित करने के लिए कैसे करने के लिए के रूप में एक वेब सेवा द्वारा दिए जाते के रूप में इस प्रश्न में चर्चा कर रहे हैं वस्तुओं:हाइबरनेट इकाइयों और डेटा स्थानांतरण वस्तुओं के बीच परिवर्तित करने के लिए एक अच्छा पैटर्न क्या है?

Is using data transfer objects in ejb3 considered best practice

कारकों यहाँ उल्लेख में से एक यह है कि यदि डोमेन मॉडल बदलता है, तो डीटीओ का एक सेट वेब सेवा के मामले में उपभोक्ताओं की रक्षा करेगा।

हालांकि ऐसा लगता है कि यह मेरे प्रोजेक्ट में पर्याप्त मात्रा में कोड जोड़ देगा, यह तर्क ध्वनि लगता है।

क्या कोई अच्छा डिज़ाइन पैटर्न है जिसका उपयोग मैं एक डीबीओ में एक हाइबरनेट इकाई (जो एक इंटरफेस लागू करता है) को परिवर्तित करने के लिए कर सकता हूं जो एक ही इंटरफ़ेस लागू करता है?

तो निम्नलिखित दोनों कार्यान्वयन 'बुक' को मानते हुए, मुझे BookEntity.class को BookDTO.class में परिवर्तित करने की आवश्यकता होगी ताकि मैं जेएक्सबी को क्रमबद्ध और वापस कर सकूं।

फिर से, यह पूरी संभावना मेरे लिए संदिग्ध प्रतीत होती है, लेकिन अगर इस रूपांतरण से निपटने में मदद के लिए वहां अच्छे पैटर्न हैं, तो मुझे कुछ अंतर्दृष्टि प्राप्त करना अच्छा लगेगा।

क्या प्रतिबिंब के माध्यम से परिवर्तित करने के लिए शायद कुछ दिलचस्प तरीका है? या एक 'बिल्डर' पैटर्न जिसे मैं नहीं सोच रहा हूं?

क्या मुझे सिर्फ डीटीओ पैटर्न को अनदेखा करना चाहिए और आसपास के इकाइयों को पास करना चाहिए?

+0

प्रश्न के बारे में बहुत सी शिकायतें, लेकिन कोई वास्तविक उत्तर नहीं :(... मुझे हाइबरनेट के साथ कठिन समय है (मैं इस विषय पर खुद को एक सफेद बेल्ट कहूंगा), क्योंकि मैं द्वारा लौटाई गई वस्तुओं का उपयोग नहीं कर सकता एचबीएम के सत्र के बाहर ढांचा। मुझे इस पृष्ठ पर सही पैटर्न की तलाश है, और कोई जवाब नहीं मिला ... – Cotta

उत्तर

16

क्या मुझे डीटीओ पैटर्न को अनदेखा करना चाहिए और आसपास के इकाइयों को पास करना चाहिए?

मेरी वरीयता आमतौर पर "हां" होती है। मुझे वास्तुशिल्प या परत शुद्धता के लिए बनाए गए समांतर पदानुक्रमों के विचार पसंद नहीं हैं।

डीजीओ पैटर्न का मूल कारण ईजेबी 1.0 और 2.0 ऐप्स में अत्यधिक चतुरता था जब इकाई ईजेबी को दृश्य स्तर पर पास किया गया था। समाधान इकाई बीन राज्य को डीटीओ में रखना था।

डीटीओ बनाने के लिए आमतौर पर दिया जाने वाला एक अन्य कारण दृश्य परत द्वारा संशोधन को प्रतिबंधित करना है। डीटीओ उस मामले में अपरिवर्तनीय वस्तुएं हैं, बिना किसी व्यवहार के। वे व्यू परत पर फेरी डेटा के अलावा कुछ भी नहीं करते हैं।

मैं तर्क दूंगा कि डीटीओ एक कोर जे 2 ईई पैटर्न है जो एक विरोधी पैटर्न बन गया है।

मुझे एहसास है कि कुछ लोग असहमत होंगे। मैं बस अपनी राय दे रहा हूँ। यह करने का एकमात्र तरीका नहीं है, न ही जरूरी है कि "सही" तरीका। यह मेरी वरीयता है।

+1

मैं आम तौर पर डीटीओ को लागू करने में भी कमी करता हूं - हिरन के लिए पर्याप्त धमाके नहीं। मैं डीएओ कक्षाओं को लागू करता हूं और हाइबरनेट के उपकरण का उपयोग करता हूं डेटाबेस से उत्पन्न/रिवर्स-इंजीनियर मॉडल कक्षाएं। यह अच्छी चीजें हैं। –

+1

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

+3

मुझे लगता है कि अगर आपके पास पूर्ण ढेर पर पूर्ण नियंत्रण है तो हाँ यह मान्य है। हालांकि, आपकी सेवा का उपयोग करके दो या दो से अधिक यूआई होने और परतों को अलग नहीं करना खतरनाक है। यदि आप जाते हैं और उस ऑब्जेक्ट में बदलाव करते हैं जिसे आप उन्हें भेज रहे हैं, तो यह आपकी कॉल को आपकी सेवा में तोड़ देगा। जब आप अपनी परत बदलते हैं तो आप अपनी सेवा के सभी कार्यान्वयनकर्ताओं को अपने कोड को अपडेट करने की उम्मीद नहीं कर सकते हैं। इस प्रकार परत अलगाव के लिए मूल कारण है, लेकिन हर संदर्भ अलग है। आपको पहले इसे समझने की जरूरत है। – avanderw

14

डीटीओ की सभी जॉली लाइकिंग के बीच एक विरोधाभासी दृश्य होने की आवश्यकता है।

टीएल; डॉ - यह कभी-कभी अभी भी उपयोगी होता है।

डीटीओ का लाभ यह है कि आपको अपने डोमेन कक्षाओं में एक अरब एनोटेशन जोड़ने की ज़रूरत नहीं है।

आप @Entity से शुरू करते हैं। इतना बुरा नहीं। लेकिन फिर आपको JAXB की आवश्यकता है ताकि आप @XMLElement आदि जोड़ सकें - और फिर आपको JSON की आवश्यकता है ताकि आप जैक्सन के लिए @JsonManagedReference जैसी चीजें जोड़ सकें, रिश्ते के साथ सही काम करने के लिए, फिर आप इत्यादि आदि। विज्ञापन infinitum।

बहुत जल्द आपका POJO अब इतना सादा नहीं है। कभी-कभी "डोमेन संचालित डिजाइन" के बारे में पढ़ें।

इसके अलावा आप कुछ ऐसे गुणों को "फ़िल्टर" कर सकते हैं जिन्हें आप देखना चाहते हैं।

5

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

4

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

+0

बहुत उपयोगी पुस्तकालय। – OJVM

2

मुझे पता है कि यह एक पुराना सवाल है, लेकिन सोचा कि मैं किसी समस्या को हल करने में मदद करने के लिए एक ढांचा पेश करने का उत्तर जोड़ूंगा।

हमारी परियोजना में जेएक्सबी ने पीओजेओ को एनोटेट किया है जो जेपीए एनोटेटेड पीओजेओ से अलग हैं। हमारी टीम बहस कर रही थी कि दो वस्तुओं (वास्तव में डेटा संरचनाओं) के बीच डेटा को कैसे स्थानांतरित किया जाए।

हमने पाया और Dozer जो (1) एक ही नाम संभालती के साथ प्रयोग कर रहे हैं, (2) एक्सएमएल मानचित्रण और दोनों के बीच डेटा की प्रतिलिपि करने के लिए तरीके के रूप में (3) कस्टम रूपांतरण:

यहाँ एक विकल्प के लिए लोगों को विचार करना है POJOs।

अब तक उपयोग करना बहुत आसान रहा है।

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

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