जेपीए में लायें मोड प्रत्येक दृढ़ता विशेषता पर, एक एनोटेशन के माध्यम से या एक एक्सएमएल मैपिंग फ़ाइल में निर्दिष्ट किया गया है।
तो आपके लक्ष्य को पूरा करने के लिए एक जेपीए विक्रेता अज्ञेय तरीका प्रत्येक डीएओ परत के लिए अलग मैपिंग फ़ाइल रखना है। दुर्भाग्यवश, प्रत्येक मैपिंग फ़ाइल के लिए इसे एक अलग पर्सिस्टेंस यूनिट की आवश्यकता होगी, लेकिन आप कम से कम एक ही इकाई वर्ग और एक ही जेपीक्यूएल क्वेरी साझा कर सकते हैं।
कोड कंकाल का पालन करें।
persistence.xml:
<persistence>
<persistence-unit name="dao-eager">
<mapping-file>orm-eager.xml</mapping-file>
</persistence-unit>
<persistence-unit name="dao-lazy">
<mapping-file>orm-lazy.xml</mapping-file>
</persistence-unit>
</persistence>
ORM-eager.xml:
<entity-mappings>
<entity class="ErrorCode">
<attributes>
<basic name="name" fetch="EAGER"/>
</attributes>
</entity>
</entity-mappings>
ORM-lazy.xml:
<entity-mappings>
<entity class="ErrorCode">
<attributes>
<basic name="name" fetch="LAZY"/>
</attributes>
</entity>
</entity-mappings>
तो यह एक EntityManagerFactory बनाने का मामला है आपके डीएओ परतों में उपयुक्त दृढ़ता-इकाई के लिए।
असल में आपको दो मैपिंग फ़ाइलों की आवश्यकता नहीं है, तो आप एंटीटी में एनोटेशन के रूप में या तो लाज़ी या ईगर निर्दिष्ट कर सकते हैं और फिर एक एक्सएमएल मैपिंग फ़ाइल में विपरीत निर्दिष्ट कर सकते हैं (हालांकि आप अभी भी दो दृढ़ता-इकाइयों को चाहते हैं)।
उपरोक्त हाइबरनेट समाधान से थोड़ा अधिक कोड हो सकता है, लेकिन आपका आवेदन अन्य जेपीए विक्रेताओं को पोर्टेबल होना चाहिए।
एक तरफ के रूप में, ओपनजेपीए FetchGroups (जेडीओ से उधार ली गई अवधारणा) का उपयोग कर उपरोक्त हाइबरनेट समाधान के लिए समान कार्यक्षमता प्रदान करता है।
एक आखिरी चेतावनी, FetchType।LAZY जेपीए में एक संकेत है, यदि आवश्यक हो तो प्रदाता पंक्तियों को उत्सुकता से लोड कर सकता है।
प्रति अनुरोध अपडेट किया गया।
इस तरह एक इकाई पर विचार करें:
@Entity
public class ErrorCode {
// . . .
@OneToMany(fetch=FetchType.EAGER) // default fetch is LAZY for Collections
private Collection myCollection;
// . . .
}
उस मामले तुम अब भी दो हठ इकाइयों आवश्यकता होगी में, लेकिन आप केवल ORM-lazy.xml की आवश्यकता होगी। मैंने क्षेत्र के नाम को और अधिक यथार्थवादी परिदृश्य को प्रतिबिंबित करने के लिए बदल दिया (केवल संग्रह और ब्लब्स डिफ़ॉल्ट रूप से FetchType.LAZY का उपयोग करते हैं)। तो जिसके परिणामस्वरूप ORM-lazy.xml इस प्रकार दिखाई देंगे:
<entity-mappings>
<entity class="ErrorCode">
<attributes>
<one-to-many name="myCollection" fetch="LAZY"/>
</attributes>
</entity>
</entity-mappings>
और persistence.xml इस तरह दिखेगा:
<persistence>
<persistence-unit name="dao-eager">
<!--
. . .
-->
</persistence-unit>
<persistence-unit name="dao-lazy">
<!--
. . .
-->
<mapping-file>orm-lazy.xml</mapping-file>
</persistence-unit>
</persistence>
धन्यवाद क्लाउस, स्पष्ट रूप से विकल्प बी कोड हाइबरनेट, जो एक ड्रॉ वापस आ गया है आयात करने पर निर्भर कर रहा है, लेकिन मैं:
आप "loadgraph" और "fetchgraph" यहाँ के बीच अंतर की जानकारी प्राप्त कर सकते यह एक कोशिश दे देंगे। –
हाय निमो, क्या आप कृपया मेरे उत्तर को हरे रंग के चेकमार्क के साथ चिह्नित कर सकते हैं। ;) – H2000
मैं अभी भी विधि बी का उपयोग कर 'सत्र बंद' मुद्दा मार रहा हूं। –