2009-12-28 9 views
6

मैं निम्नलिखित जाहिरा तौर पर गैर-दस्तावेजी समस्या का सामना है, और मैं अगरहाइबरनेट द्वितीय स्तर कैश ऑब्जेक्ट्स जो आलसी = झूठी हैं, परिणामस्वरूप डिफ़ॉल्ट fetch = join में, क्या यह कहीं भी दस्तावेज है?

  1. मैंने कुछ गलत
  2. किसी को भी एक ही मुद्दे का सामना किया है किया समझने के लिए करना चाहते हैं?
  3. क्या यह वास्तव में कहीं भी दस्तावेज नहीं है? या किसी को याद किया था?

व्यवहार इस निम्नलिखित मानचित्रण

<class name="org.sample.Foo" table="foo"> 
    ... 
    <many-to-one name="bar" class="org.sample.Bar"/> 
</class> 


<class name="org.sample.Bar" table="bar" lazy="false"> 
    ... 
</class> 

पहले मान लें, एक पृष्ठभूमि के रूप में, डिफ़ॉल्ट मान हाइबरनेट के लिए एक कई-से-एक संबंध पर विशेषता लाने होना चाहिए "का चयन करें ", यह कम से कम दस्तावेज है (जब मैं इसे पाता हूं तो मैं लिंक जोड़ दूंगा)

हालांकि, यह स्पष्ट रूप से केवल सच है यदि संदर्भित वर्ग आलसी =" सत्य "है!

तो जाहिरा तौर पर ऊपर मानचित्रण इस में अनुवाद किया जाता है (क्योंकि बार आलसी है = "false"):

<class name="org.sample.Foo" table="foo"> 
    ... 
    <many-to-one name="bar" class="org.sample.Bar" *fetch="join" /> 
</class> 


<class name="org.sample.Bar" table="bar" lazy="false"> 
    ... 
</class> 

अब क्यों कि एक मुद्दा हो सकता है? 2 चयनों के बजाय, हाइबरनेट अपने "पैरेंट" (एक ही चयन में बार के साथ लोड फू) के साथ एक ही चयन में गैर आलसी संदर्भ लोड करेगा

यह वास्तव में समझ में आता है, क्योंकि वस्तु आलसी नहीं है, क्यों लोड नहीं है यह?

उत्तर यह है: क्या होता है यदि बार दूसरे स्तर के कैश में होता है?

<class name="org.sample.Foo" table="foo"> 
    ... 
    <many-to-one name="bar" class="org.sample.Bar" *fetch="join" /> 
</class> 


<class name="org.sample.Bar" table="bar" lazy="false"> 
    <cache usage="transactional" /> 
    ... 
</class> 

और इसका उत्तर है - कुछ भी नहीं बदलता है!

स्पष्ट रूप से कोई मानता है कि हाइबरनेट यह समझने के लिए पर्याप्त स्मार्ट है कि इस प्रकार की वस्तुओं को लोड नहीं किया जाना चाहिए, लेकिन चूंकि डिफॉल्ट फ़ेच को चुनने से चुनने के लिए बदल दिया गया था, इसलिए हाइबरनेट में कोई विकल्प नहीं है (आप शामिल नहीं हो सकते 2 स्तर कैश के साथ वास्तविक मेज, अभी तक)

तो हाइबरनेट यह क्या बताया गया है, और एक डेटाबेस जहां यह 2 स्तर कैश

समाधान मैंने पाया में पहले से ही है से एक वस्तु लाने के लिए शामिल होने का उपयोग करता है करता है लाने के लिए मैपिंग को शाब्दिक रूप से बदलना है = "चयन करें"

अब जब बार के लिए दूसरा चयन है जाने के बारे में, हाइबरनेट समझता है कि इसे डेटाबेस में नहीं जाना चाहिए, और इसे कैश से प्राप्त करना चाहिए। और केवल 1 क्वेरी निष्पादित होगी (गर्मियों के बाद)

+0

fetch व्यवहार ऑब्जेक्ट पर क्वेरी करने के लिए उपयोग की जाने वाली API पर निर्भर है। क्या आप एचक्यूएल या मानदंड एपीआई का उपयोग कर रहे हैं? – skaffman

+0

न तो, एक साधारण session.load (Foo.class, id) –

उत्तर

4

मुझे एक ही समस्या का सामना करना पड़ा, और मुझे अपने सभी से एक संबंधों को चिह्नित करने में पाया गया जो fetch="select" के रूप में कैश किए जाएंगे। उस समय जब क्वेरी तैयार की जाती है, तो हाइबरनेट यह नहीं जान सकता कि बार का अनुरोधित उदाहरण दूसरे स्तर के कैश में है या नहीं (मान लीजिए कि फू कैश में नहीं है)।

+0

लेकिन क्या यह अजीब नहीं है कि यह दस्तावेज नहीं है, यहां तक ​​कि आधिकारिक वाणिज्यिक पुस्तकों में भी नहीं?यहां तक ​​कि फोरम में या यहां SO में मुझे इस मुद्दे का कोई उल्लेख नहीं मिला ... –

+0

मैं सहमत हूं। लेकिन यह समझने के लिए कि वास्तव में हाइबरनेट क्या करता है, मुझे अक्सर एसक्यूएल लॉगिंग करना पड़ता है और वास्तव में क्या चल रहा है पर एक नज़र डालना पड़ता है। – bertolami

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