2012-12-24 16 views
5

में जेवासिस्ट आलसी एंटीटी प्रॉक्सी उदाहरणों से बचने के लिए कैसे करें मुझे सही इकाई के बजाय आलसी जावस्सिस्ट इंस्टेंस प्रॉक्सी देने के लिए हाइबरनेट से बचने के लिए क्या बदलना है?हाइबरनेट

अद्यतन: मैं वसंत 3.x उपयोग कर रहा हूँ और हाइबरनेट 4.x

एपीआई मैं इकाई लोड करने में उपयोग कर रहा हूँ org.hibernate.internal.SessionImpl#load(Person.class, Id) जाता है और बस मानचित्रण:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping package="org.perfectjpattern.example.model"> 
<class name="Person" table="PERSON_" > 
    <id name="id"> 
     <generator class="native"></generator> 
    </id> 
    <property name="name" update="false" /> 
    <property name="age" update="true" /> 
</class> 

<query name="Person.findByName"> 
    <![CDATA[select p from Person p where p.name = ? ]]> 
</query> 

<query name="Person.findByAge"> 
    <![CDATA[select p from Person p where p.age = :Age ]]> 
</query> 
</hibernate-mapping> 
+2

आलसी लोडिंग के बजाय उत्सुक का उपयोग करें। –

+0

मैं कल्पना कर सकता हूं, लेकिन वास्तव में और कहां कॉन्फ़िगर करने की आवश्यकता है, यह ओपी –

+0

है यदि आप हमें अपनी मैप की गई इकाइयों में से एक दिखाते हैं तो हम आपकी मदद कर सकते हैं। –

उत्तर

0

वास्तव में बस के लिए मानचित्रण (देखें default-lazy="false") बदलकर इसे हल:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping package="org.perfectjpattern.example.model" default-lazy="false"> 
+4

यह बहुत खतरनाक है क्योंकि यह सभी इकाइयों और संग्रहों को गैर-आलसी होने के लिए सेट करता है, जिसका अर्थ है कि आप आसानी से पूरे डेटाबेस को दुर्घटना से स्मृति में लोड कर सकते हैं। –

+0

इसे लाने के लिए धन्यवाद, हालांकि, जैसा कि आप ओपी में नोट कर सकते हैं मेरे पास मेरी मैपिंग में परिभाषित एकमात्र इकाई है। मेरे उपयोग-मामले में मैं केवल एक तत्व 'आईडी' लोड करता हूं (आईडी द्वारा)। यदि मैं एक बड़ी परियोजना बनाए रखता हूं तो प्रत्येक इकाई की अपनी मैपिंग फ़ाइल होगी जहां मैं तय कर सकता हूं कि लोडिंग नीति क्या होनी चाहिए। सिक्का का दूसरा पक्ष भी है जहां विभिन्न उपयोग-मामलों के लिए मुझे या तो 'लोड' या 'प्राप्त' का आह्वान करना है, यह कोड पुन: प्रयोज्य दृष्टिकोण से अच्छी बात नहीं है। –

5

उपयोग get() बजाय load()

+0

+1 लेकिन मुझे लगता है कि 'लोड' अधिक लचीला होगा क्योंकि अन्य मामलों में मैं आलसी लोड चुन सकता हूं। मैं इसे हर इकाई के लिए अलग से कॉन्फ़िगर कर सकता हूं। –

+0

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

+0

लेकिन यह भी ध्यान रखें कि यदि आपके आवेदन को वास्तव में इसके बारे में पता होना चाहिए, तो आप लगभग निश्चित रूप से कुछ गलत कर रहे हैं। आलसी लोडिंग पारदर्शी होने के लिए डिज़ाइन किया गया है। –

1

आप session.load(id) के बाद Hibernate.initialize(obj) उपयोग कर सकते हैं।

यह विधि तुरंत आपके ओबीजे को आरंभ कर सकती है।

+0

... जो मूल रूप से एक जटिल और धीमी संस्करण है [session.get() का उपयोग करके] (http://stackoverflow.com/a/14024110/839646)। –

+0

जब आप इसे हमेशा प्रारंभ करने के बजाय आवश्यक हो तो आप अपने ओबीजे को प्रारंभ कर सकते हैं। – ivivi