2008-10-21 13 views
10

मेरे पास एक डोमेन ऑब्जेक्ट पर एक संपत्ति है जिसे कई से एक तत्व में घोषित किया गया है। इस संपत्ति के मूल वाक्य रचना इस तरह दिखता है:हाइबरनेट को उत्सुकता से कई-से-एक संबंधित ऑब्जेक्ट लाने से रोकने के लिए कैसे करें

<many-to-one name="propertyName" class="propertyClass" fetch="select" not-found="ignore" lazy="proxy" /> 

अब, विचार है करने के लिए हाइबरनेट नहीं बेसब्री से इस संपत्ति लाने है। यह शून्य हो सकता है, इसलिए ज्ञात अनदेखा सेट नहीं है।

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

अगर, हालांकि, नहीं पाया अपवाद पर सेट है (या अपवाद के लिए चूक) है, जो इस संपत्ति एक प्रॉक्सी लोड करते जनक वर्गों!

मैं कैसे एक प्रॉक्सी लोड नहीं से हाइबरनेट बंद कर सकते हैं, जबकि अभी भी इस संपत्ति अशक्त होने के लिए अनुमति देता है?

मैं आलसी पाया = कोई प्रॉक्सी, लेकिन बाईटकोड संशोधन के कुछ प्रकार के बारे में बात करती है और प्रलेखन किसी भी जानकारी में जाने नहीं देता है। क्या कोई मेरी मदद कर सकता है?

यदि यह महत्वपूर्ण है, तो यह हाइबरनेट का जावा संस्करण है, और यह कम से कम संस्करण 3 है (यदि यह मदद करता है तो मैं वास्तविक संस्करण देख सकता हूं, लेकिन यह अब के लिए हाइबरनेट 3+ है)।

मैंने पहले निर्दिष्ट नहीं किया था, लेकिन जावा संस्करण 1.4 है। तो, जावा एनोटेशन समर्थित नहीं हैं।

उत्तर

9

संघ के दूसरे छोर अशक्त हो सकता है, तो मेरा मानना ​​है कि हाइबरनेट क्रम में संघ अंत के लिए क्वेरी चाहिए निर्धारित करने के लिए अगर यह एक प्रॉक्सी या नहीं (प्रॉक्सी की कोई जरूरत का उपयोग करना चाहिए अगर दूसरे छोर रिक्त है)। मुझे अभी इस संदर्भ का पता नहीं लगाया जा रहा है, लेकिन मुझे इसे कहीं पढ़ना याद है।

आदेश क्षेत्रों दस्तावेज के आलसी लोडिंग प्रदान करने के लिए buildtime पर खेतों पर बाईटकोड संवर्द्धन को दर्शाता है: Using lazy property fetching। यहां एक अंश दिया गया है:

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

आलसी संपत्ति लोडिंग के लिए बिल्डटाइम बाइटकोड उपकरण की आवश्यकता है! यदि आपकी लगातार कक्षा बढ़ी नहीं है, तो Hibernate चुपचाप आलसी संपत्ति सेटिंग्स को अनदेखा कर देगा और तुरंत को तत्काल लाने के लिए गिर जाएगी।

+0

यह आशाजनक लग रहा है ... अगर यह काम करता है तो मैं आपका जवाब स्वीकार करूंगा। धन्यवाद! – MetroidFan2002

+0

कोई बात नहीं, लेकिन मैं मूल रूप से लगता है कि आप एकल सिरे संघों के साथ एक आलसी प्रॉक्सी नहीं हो सकता है की तुलना में अशक्त हो सकता है (एक-से-एक या कई-टू-पर)। भारी ढेर खपत के लिए, मुझे क्लॉब्स की वजह से एक ही समस्या थी, मैंने क्लॉब्स को दूसरी कक्षा में खींचकर और आवश्यकतानुसार लोड कर दिया। –

+0

मुझे लगता है कि हम जो करने जा रहे हैं वह उस वर्ग में फ़ील्ड डालता है जो कि विशाल है (यह एक XML दस्तावेज़ है जिसे अंततः वेब सेवा में भेजा जाता है) आलसी लोड किए गए फ़ील्ड में, बाइटकोड सामग्री का उपयोग करके आप इंगित करते हैं। दुर्भाग्यवश, डोमेन मॉडल मेरे हाथों से बाहर है। – MetroidFan2002

0

यदि आप नियंत्रक के माध्यम से मॉडल से दृश्य में हाइबरनेट ऑब्जेक्ट पास कर रहे हैं, तो नहीं!

बजाय एक "स्नैपशॉट वस्तु" हाइबरनेट वस्तु आप को देखने के लिए पारित करने के लिए और प्रदर्शित किया चाहते से मूल्यों को स्टोर करने के लिए बनाते हैं।

क्यों? प्रॉक्सी अभी भी नियंत्रक में होने पर मानों को पुनर्प्राप्त कर सकता है ... लेकिन जब आप प्रॉक्सी/ऑब्जेक्ट को दृश्य में पास करते हैं तो यह अब मानों को पुनर्प्राप्त नहीं कर सकता क्योंकि लेनदेन पहले ही समाप्त हो चुका है। और यही कारण है कि मैंने सुझाव दिया है कि मेरे ऊपर क्या है।

+1

जब आप ओपन सत्र इन व्यू पैटर्न – miceuz

+1

का उपयोग करते हैं, तो इसके अलावा पूछे गए प्रश्न से कोई लेना देना नहीं है। यह किसी भी विशेष दृश्य प्रौद्योगिकी या नियंत्रक के बारे में नहीं है। यहां तक ​​कि जुनीट परीक्षणों में भी यह व्यवहार होता है। वस्तु के प्रकार के सुझाव एक "डाटा ट्रांसफर ऑब्जेक्ट", वैसे है। लेकिन इसकी कोई प्रासंगिकता नहीं है। – MetroidFan2002

+0

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

0

हाइबरनेट व्याख्या का उपयोग करते, @ManyToOne डाल (लाने = FetchType.LAZY) संघ पर, पूरा करता आप क्या चाहते हैं। क्या आपने यह देखने के लिए fetch = "आलसी" सेट करने का प्रयास किया है कि यह काम करता है या नहीं?

+0

मुझे यह भी सुनिश्चित नहीं है कि fetch = "आलसी" XML कॉन्फ़िगरेशन के लिए एक वैध संपत्ति है । Http://www.hibernate.org/hib_docs/v3/reference/en-US/html/mapping.html (5.1.12) के अनुसार, fetch "join | select" तक ही सीमित है। इसके अलावा, जावा संस्करण केवल 1.4 है, इसलिए एनोटेशन बाहर हैं। मैं सवाल संपादित करूंगा। – MetroidFan2002

0

@ मिगुएल पिंग: मुझे लगता है कि जिस पृष्ठ का आप उल्लेख कर रहे हैं वह है [http://www.hibernate.org/162.html]। जहां तक ​​मैं समझता हूं, एक-एक तरफ के मामले में अतिरिक्त चयन की आवश्यकता होती है, जहां विदेशी कुंजी मौजूद नहीं होती है। constrained="true" सेट करना हाइबरनेट को बताता है कि दूसरी तरफ हमेशा मौजूद है और कोई अतिरिक्त चयन की आवश्यकता नहीं है।

इतने सारे करने के लिए एक तरफ, जहां विदेशी कुंजी बसता था, यह आवश्यक नहीं होना चाहिए एक और चयन पर अमल करने के बाद से FK का मूल्य अगर दूसरे छोर वर्तमान या null है बताता है के लिए

। कम से कम, मैं इसे समझता हूं।

अब तक सिद्धांत के लिए। प्रॉक्सी विदेशी कुंजी/कई से एक तरफ मेरे लिए काम करता है। संघ के लिए इस्तेमाल किया मानचित्रण है:

<many-to-one name="haendler" column="VERK_HAENDLOID" lazy="proxy" />

लेकिन प्रॉक्सी दिए गए URL (constrained="true") में वर्णित एक तरह एक मानचित्रण का उपयोग कर एक-से-एक तरफ मेरे लिए काम नहीं करता। हम्म, मुझे लगता है कि मैं इसके लिए एक प्रश्न खोलूंगा। ;-)

2

मैं आलसी = कोई प्रॉक्सी पाया है, लेकिन बाईटकोड संशोधन के कुछ प्रकार के बारे में प्रलेखन बात करती है और जाना नहीं है किसी भी जानकारी में। क्या कोई मेरी मदद कर सकता है बाहर?

मुझे लगता है कि आप अपनी परियोजना बनाने के लिए एएनटी का उपयोग कर रहे हैं।

<property name="src" value="/your/src/directory"/><!-- path of the source files --> 
<property name="libs" value="/your/libs/directory"/><!-- path of your libraries --> 
<property name="destination" value="/your/build/directory"/><!-- path of your build directory --> 

<fileset id="applibs" dir="${libs}"> 
    <include name="hibernate3.jar" /> 
    <!-- include any other libraries you'll need here --> 
</fileset> 

<target name="compile"> 
    <javac srcdir="${src}" destdir="${destination}" debug="yes"> 
    <classpath> 
     <fileset refid="applibs"/> 
    </classpath> 
    </javac> 
</target> 

<target name="instrument" depends="compile"> 
    <taskdef name="instrument" classname="org.hibernate.tool.instrument.javassist.InstrumentTask"> 
    <classpath> 
     <fileset refid="applibs"/> 
    </classpath> 
    </taskdef> 

    <instrument verbose="true"> 
    <fileset dir="${destination}"> 
     <!-- substitute the package where you keep your domain objs --> 
     <include name="/com/mycompany/domainobjects/*.class"/> 
    </fileset> 
    </instrument> 
</target> 
2

सुनिश्चित करें कि आपकी कक्षा अंतिम नहीं है!

+0

यह सवाल पूछता है: क्यों? – JBert

+1

किसी और के लिए, जिसकी पूछना वही है, मैं इस पर आया: http://stackoverflow.com/a/5594863/280924 – brainydexter

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