2012-11-29 31 views
10

मेरे पास एक इकाई का एक समूह है जो चक्र बनाने के लिए एक दूसरे से जुड़ता है यानी, मूल इकाई पी में दो बच्चे इकाइयों सी 1 और सी 2 और दो के साथ दो-से-कई संबंध हैं इनमें से एक के पास एक और इकाई ए के साथ एक से अधिक संबंध हैं। एंटिटी ए इन इकाइयों (सी 1, सी 2) के सहयोग को महसूस करता है और रिश्ते के गुणों को परिभाषित करता है (यह सिर्फ एक जॉइन टेबल नहीं है)। सभी रिश्तों दोनों दिशाओं में navigable हैं।
domain objects
निम्नलिखित प्रश्न इस डिजाइन से उत्पन्न होती है: क्या झरना रणनीति होना चाहिए ताकि इकाई ए, मर्ज किए गए कायम किया जा सकता है/यह देखते हुए कि आप हमेशा जड़ इकाई पी पर इकाई प्रबंधक संचालन आह्वान? क्या दोनों पथों से पहुंचने योग्य कैस्केड होना चाहिए?जेपीए + हाइबरनेट - इकाई संबंधों में चक्र - कैस्केड रणनीति

विचार: ऐसा लगता है कि यदि एप्लिकेशन केवल एक कैस्केड पथ प्रदान करने का विकल्प चुनता है तो ऐसे परिदृश्य हो सकते हैं जो एक क्षणिक ऑब्जेक्ट अपवाद को फेंक देते हैं। यदि यह दोनों पथ प्रदान करता है तो इन पथों को पूर्ण चक्र बनाना होगा उदाहरण के लिए सी 1 को ए

संस्करणों के माध्यम से सहेजने का प्रयास किया जा सकता है: जेपीए 2.0, हाइबरनेट कोर 4.1.7, हाइबरनेट-जेपीए-2.0-एपीआई 1.0 .1

उत्तर

3

मैं आपको अपना 2 सेंट दे सकता हूं, क्षमा करें अगर मेरा जवाब थोड़ा लंबा है।

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

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

बेशक आप अन्यथा कर सकते हैं (हम सब आलसी हो सकते हैं), लेकिन अंत में आप अपने एकल दृढ़ता प्रवाह (या दृढ़ता विन्यास) और अपने व्यापार प्रवाह के बीच युग्मन का एक वेब बना सकते हैं। आपको बहुत सारे अपवादों का प्रबंधन करना होगा, और आपके द्वारा पहले रखे गए कैस्केड रणनीति के आसपास बहुत से कॉन्फ़िगरेशन तर्क करना होगा (सहेजें, अपडेट करें, हटाएं)।

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

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

आइए कहें कि पी एक बैंक है, और सी 1 और सी 2 दो ग्राहक हैं, और ए एक उत्पाद है।

मेरे पास दो आसान उत्तर हैं: 1) प्रत्येक परत को बिना किसी कैस्केडिंग के अलग से बचाया जा सकता है। लेकिन यह एक ही लेनदेन के भीतर किया जा सकता है, और उसी डीएओ में या यदि आप चाहते हैं तो नहीं।

2) पी और सी "कैस" कैस्केड किया जा सकता है। लेकिन ए को एक अलग वर्कफ़्लो में सहेजा जाना चाहिए।

यह मैं पीटर कोड के एक अध्याय की याद दिलाता है, जहां वह एक "डोमेन प्रेरित विश्लेषण" के बारे में बात: http://www.petercoad.com/download/bookpdfs/jmcuch01.pdf

यह अध्याय बताते हैं कि कैसे एक ग्राफ में विभिन्न वस्तुओं अलग आद्यरूप में अलग किया जा सकता। दृढ़ता वर्कफ़्लो लेनदेन संबंधी डेटा और विवरण, या "चीज़" के बीच समान नहीं होना चाहिए।

The four archetypes of Peter Coad are: 
- Is it a moment or interval? 
- Is it a role played? 
- Is it a catalog-entry-like description? 
- Otherwise, it's a party, place, or thing. 

मुझे आशा है कि यह मदद करता है: इस जगह में एक बेहतर व्यापक रणनीति डाल करने के लिए कर सकते हैं।

3

आम तौर पर केवल एक अच्छा विचार है कि केवल निकट संगठनों में और केवल माता-पिता-> बच्चे (या मालिक-> स्वामित्व वाली) दिशा में कैस्केड करना है। आपके मामले में यह शायद P->C1 और P->C2 होगा। चूंकि A में एक स्पष्ट अभिभावक नहीं है, इसलिए इसे अलग से सहेजा जाना चाहिए। यह P (और C1, C2) के साथ एक ही लेनदेन में आपके डीएओ में उल्लिखित @etienno के रूप में किया जा सकता है। मैं आपके डोमेन मॉडल को नहीं जानता, लेकिन शायद A वैचारिक स्तर पर एक अलग इकाई है, जिस स्थिति में एक अलग बचत और भी उचित है।

कई ऑब्जेक्ट्स को कैस्केडिंग जो निकटता से संबंधित नहीं हैं, लंबे समय तक पूरे ग्राफ को बना सकते हैं, जब यह बड़ा, अप्रबंधनीय हो जाता है।

इस तरह की स्थितियों में सवाल पूछना हमेशा अच्छा होता है कि "हाइबरनेट के बिना आप इसे कैसे करेंगे"। आपके मामले में आप शायद पहले P, C1, C2 और फिर A बचाएंगे। AFAIK जेपीए/हाइबरनेट इस तरह के आदेश को लागू करने के लिए कोई स्पष्ट तरीका प्रदान नहीं करता है, इसलिए कुछ चीजें मैन्युअल रूप से आपके द्वारा की जानी चाहिए।