2011-09-11 11 views
7

एक वसंत/हाइबरनेट आधारित परियोजना में, हमारे पास दो इकाइयों के बीच एक से अधिक संबंध हैं। आवश्यक संचालन हैं:क्या बिडरेक्शनल एसोसिएशन को हाइबरनेट करना चाहिए?

  • बच्चे के माता-पिता को ढूंढें;
  • माता-पिता के बच्चों को ढूंढें;
  • जब माता-पिता को हटाया जा रहा है, तो हमें बच्चों को हटाने की भी आवश्यकता है;
  • बच्चों को बड़े पैमाने पर बनाएं।

हम इसे लागू करने के दो तरीकों से आए।

  1. Bidirectional association: बच्चे इकाई @ManyToOne स्तंभ यह माता पिता को जोड़ने की है, और माता-पिता बच्चों की @OneToMany आलसी-लोडेड संग्रह है। उपरोक्त सभी कार्यों के मॉडल में प्रदर्शन किया जा सकता है:

    child.getParent(); 
    parent.getChildren(); //lazy loading 
    session.delete(parent); //cascade removal of the children does the trick here 
    session.save(parent); //cascade persist created the children 
    
  2. यूनिडायरेक्शनल संघ: बच्चे इकाई @ManyToOne स्तंभ यह माता पिता को जोड़ने है, लेकिन माता-पिता बच्चों के लिए किसी भी लिंक नहीं है। अधिकांश संचालन सेवा तरीकों में किया जाना चाहिए:

    child.getParent(); //still in the model 
    Collection<Child> findChildren(Parent parent); //service method in ChildService 
    void deleteChildren(Parent parent); //service method in ChildService 
    void createChild(Parent parent, ... childAttributes); //service method in ChildService invoked for each new child. 
    

पहले दृष्टिकोण को लागू करने के लिए आसान हो रहा है (आप हाइबरनेट व्यापक कार्यक्षमता का पुन: उपयोग कर सकते हैं), लेकिन हम में से कुछ समस्याओं का एक संभावित कारण के रूप में द्विदिश संघों को देखने के ।

बेहतर डिज़ाइन विकल्प क्या होना चाहिए? क्या बिडरेक्शनल दृष्टिकोण द्वारा बनाई गई कोई भी ज्ञात समस्या, प्रदर्शन या डिज़ाइन है?

+0

क्या आप ऐसे स्रोत के बारे में जानते हैं जो बताता है कि काम करने के लिए आलसी लोडिंग कैसे प्राप्त करें? मुझे जेएसएफ परियोजना में इससे परेशानी थी। –

+1

"हम में से कुछ बिडरेक्शनल एसोसिएशन को समस्याओं के संभावित कारण के रूप में देखते हैं" - क्या आप इन संभावित समस्याओं का नाम दे सकते हैं? –

उत्तर

3

यदि आपके प्रश्न हाइबरनेट द्वारा दृश्य के पीछे निष्पादित प्रश्नों के समान ही काम करते हैं, तो जब यह बच्चों को आलसी लोड करता है, तो मुझे नहीं लगता कि आप OneToMany एसोसिएशन को सरलता से नहीं प्राप्त करते हैं।

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

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

0

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

YMMV

0

@JB Nizet द्वारा जवाब कहते हैं कि यह लगभग सभी, बस एक और बात: विधि कॉल नमूने आप पोस्ट को देखते हुए, द्विदिश विधि शायद अपने व्यापार तर्क कोड कुछ और अधिक पठनीय कर देगा।

-1

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

+1

यह एक उत्तर के बजाय, एक टिप्पणी की तरह लगता है। – mattias

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