मैं स्प्रिंग फ्रेमवर्क के साथ संयोजन में हाइबरनेट का उपयोग करने के लिए हूं और यह घोषणात्मक लेनदेन सीमांकन क्षमताओं (जैसे, @ ट्रेंसेक्शनल ) है।
जैसा कि हम सभी जानते हैं, हाइबरनेट गैर-आक्रामक और जितना संभव हो उतना पारदर्शी होने की कोशिश करता है, हालांकि यह रिश्तों को नियोजित करते समय थोड़ा अधिक चुनौतीपूर्ण साबित होता हैlazy-loaded
।
मैं पारदर्शिता के विभिन्न स्तरों के साथ कई डिज़ाइन विकल्प देखता हूं।
- रिश्तों को आलसी-लोडेड न बनाएं (जैसे,
fetchType=FetchType.EAGER)
- यह आलसी लोडिंग के पूरे विचार को दिखाता है।
- प्रारंभिक संग्रह का उपयोग कर
Hibernate.initialize(proxyObj);
- इसका मतलब है डीएओ के लिए अपेक्षाकृत उच्च-युग्मन
- यद्यपि हम एक इंटरफेस को परिभाषित कर सकते हैं
initialize
, अन्य कार्यान्वयन किसी भी समकक्ष प्रदान करने की गारंटी नहीं है।
Model
खुद को लगातार वस्तुओं के लिए लेनदेन व्यवहार जोड़ें (या तो गतिशील प्रॉक्सी या@Transactional
)- मैंने डायनेमिक प्रॉक्सी अप्रोच की कोशिश नहीं की है, हालाँकि मुझे कभी भी ऐसा प्रतीत नहीं हुआ कि मैं खुद लगातार वस्तुओं पर काम कर रहा हूं। संभवतया उस हाइबरनेट के साथ एक प्रॉक्सी पर ऑपरेशन किया जा रहा है जिसमें मधुमक्खी हो।
- नियंत्रण का नुकसान जब लेनदेन वास्तव में हो रहा है
- दोनों आलसी / गैर-आलसी एपीआई, जैसे,
loadData()
औरloadDataWithDeps()
- कौन सी दिनचर्या को नियोजित करना है, यह जानने के लिए आवेदन को मजबूर करता है, फिर से तंग युग्मन
- विधि अतिप्रवाह,,
loadDataWithA()
....,loadDataWithX()
- निर्भरता के लिए बल खोज, जैसे, केवल
byId()
संचालन प्रदान करके- इसके बजाय
findZzzById(zid)
, और फिरgetYyyIds(zid)
इसके बजाय गैर-ऑब्जेक्ट ओरिएंटेड रूटीन की आवश्यकता होती हैz.getY()
- लेनदेन के बीच एक बड़ा प्रसंस्करण ओवरहेड होने पर, एक-एक करके एक संग्रह में प्रत्येक वस्तु को लाने के लिए उपयोगी हो सकता है।
- इसके बजाय
- केवल डीएओ के बजाय आवेदन @ ट्रेंसेक्शनल का हिस्सा बनाएं
- नेस्टेड लेनदेन के संभावित विचार
- लेन-देन प्रबंधन के लिए अनुकूलित दिनचर्या की आवश्यकता होती है (जैसे, पर्याप्त रूप से छोटी)
- छोटे प्रोग्रामेटिक प्रभाव, हालांकि बड़े लेनदेन का परिणाम हो सकता है
- डायनेमिक फ़्रेच प्रोफ़ाइल के साथ DAO प्रदान करें , जैसे,
loadData(id, fetchProfile);
- एप्लिकेशन को पता होना चाहिए कि किस प्रोफ़ाइल का उपयोग कब करना है
- एओपी प्रकार के लेनदेन, जैसे, संचालन को रोकते हैं और आवश्यक होने पर लेनदेन करते हैं
- बाइट-कोड हेरफेर या प्रॉक्सी उपयोग की आवश्यकता है
- लेन-देन करने पर नियंत्रण का नुकसान
- काला जादू, हमेशा की तरह :)
क्या मुझे कोई विकल्प याद आया?
lazy-loaded
आपके एप्लिकेशन डिज़ाइन में रिश्तों के प्रभाव को कम करने की कोशिश करते समय आपका पसंदीदा तरीका कौन सा है ?
(ओह, और WoT के लिए खेद है )