2013-08-01 6 views
42

मुझे समस्या का सामना करना पड़ा कि एक-से-एक आलसी लोडिंग हाइबरनेट में काम नहीं करता है। मेरे पास पहले से ही इसे हल कर चुका है, लेकिन अभी भी ठीक से समझता है कि क्या होता है।हाइबरनेट: एक-से-एक आलसी लोडिंग, वैकल्पिक = झूठा

मेरे कोड (आलसी लोड हो रहा है यहाँ काम नहीं करता है, जब मैं व्यक्ति खींच - पता भी प्राप्त किए गए है):

@Entity 
public class Person{ 

    @Id 
    @SequenceGenerator(name = "person_sequence", sequenceName = "sq_person") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "person_sequence") 
    @Column(name = "id") 
    private long personID; 

    @OneToOne(mappedBy="person", cascade=CascadeType.ALL, fetch = FetchType.LAZY) 
    private Adress address; 
    //.. getters, setters 
} 

@Entity 
public class Address { 

    @Id 
    @Column(name="id", unique=true, nullable=false) 
    @GeneratedValue(generator="gen") 
    @GenericGenerator(name="gen", strategy="foreign", [email protected](name="property", value="person")) 
    private long personID; 

    @PrimaryKeyJoinColumn 
    @OneToOne 
    private FileInfo person; 
} 

लेकिन: मैं OneToOne रिश्ते में जोड़ने optional=false, आलसी लोड हो रहा है ठीक काम करता है!

@OneToOne(mappedBy="person", cascade=CascadeType.ALL, optional = false, fetch = FetchType.LAZY) 
private Adress address; 

प्रश्न/विनती: कृपया, मुझे समझा कैसे optional=false एनोटेशन आलसी लोड हो रहा है प्राप्त करने के लिए मदद करता है।

पीएस मैंने post1 और post2 पोस्ट पढ़े हैं, और समझते हैं कि क्यों सरल OneToOne आलसी नहीं हो सकता है, लेकिन मैं अभी भी optional=false जादू को समझ नहीं सकता।

+0

हे @ वोलोडिमिर, मुझे आपके साथ एक ही समस्या है। मैं एक इकाई से एक ब्लॉब कॉलम अलग करने की कोशिश कर रहा हूँ। अभिभावक इकाई में बाल इकाई है। बाल इकाई में बाइनरी कॉलम होता है। अभिभावक और बच्चा 'एक ही टेबल' हैं इसलिए मैं @OneToOne रिश्ते का उपयोग करता हूं। हालांकि मैंने LAZY fetchType का उपयोग किया लेकिन ऐसा लगता है कि यह काम नहीं करता है। जब मैं 'वैकल्पिक = झूठा 'डालता हूं, यह काम करता है। वास्तव में किसी भी स्पष्टीकरण की सराहना की जाएगी। – Emerald214

+0

@ Emerald214 क्षमा करें, वह 2 साल पहले था।वर्तमान में मैं जेएस मोबाइल लिख रहा हूं, और आपकी मदद नहीं कर सकता –

+0

वनटोन वैकल्पिक = झूठी कैस्केड टाइप के साथ काम नहीं करता है। PERSIST देखें: https://hibernate.atlassian.net/browse/HHH-9670 – sliver

उत्तर

62

यदि एसोसिएशन वैकल्पिक है, तो हाइबरनेट को यह जानने का कोई तरीका नहीं है कि कोई प्रश्न जारी किए बिना किसी दिए गए व्यक्ति के लिए कोई पता मौजूद है या नहीं। इसलिए यह प्रॉक्सी के साथ पता फ़ील्ड को पॉप्युलेट नहीं कर सकता है, क्योंकि व्यक्ति को संदर्भित करने में कोई एड्रेस नहीं हो सकता है, और यह इसे शून्य के साथ पॉप्युलेट नहीं कर सकता है, क्योंकि व्यक्ति का संदर्भ देने वाला पता हो सकता है।

जब आप एसोसिएटियो अनिवार्य (यानी optional=false) बनाते हैं, तो यह आपको विश्वास करता है और मानता है कि एक पता मौजूद है, क्योंकि एसोसिएशन अनिवार्य है। तो यह सीधे प्रॉक्सी के साथ पता फ़ील्ड को पॉप्युलेट करता है, यह जानकर कि व्यक्ति का संदर्भ देने वाला एक पता है।

+0

वैकल्पिक = झूठा यदि आप एड्रेस के बिना पर्सन को सहेजने का प्रयास करते हैं तो काम नहीं कर रहा है: "org.hibernate.PropertyValueException: नॉन-नल प्रॉपर्टी एक शून्य या क्षणिक मान का संदर्भ देता है:" –

+3

वैकल्पिक = झूठा मतलब है कि ... पता वैकल्पिक नहीं है। तो यह अनिवार्य है। तो इसे शून्य पर सेट अपवाद को फेंकता है। यह काफी उम्मीद है। –

+0

तो, OneToOne, आलसी लोडिंग, साझा प्राथमिक कुंजी और एक तरफ वैकल्पिक के साथ, हाइबरनेट के साथ बस असंभव है, है ना? –

5

सबसे आसान एक नकली से कई रिश्तों के लिए है। यह काम करेगा क्योंकि संग्रह की आलसी लोडिंग बहुत आसान है, फिर एकल नलिका संपत्ति की आलसी लोडिंग लेकिन आमतौर पर यह समाधान बहुत ही असुविधाजनक होता है यदि आप जटिल जेपीक्यूएल/एचक्यूएल प्रश्नों का उपयोग करते हैं।

दूसरा एक बिल्ड टाइम बाइटकोड उपकरण का उपयोग करना है। अधिक जानकारी के लिए कृपया हाइबरनेट दस्तावेज पढ़ें: 1 9 .1.7। आलसी संपत्ति लाने का उपयोग करना। याद रखें कि इस मामले में आपको @LazyToOne(LazyToOneOption.NO_PROXY) एनोटेशन को आलसी बनाने के लिए एक-से-एक संबंध जोड़ना होगा। लाज़ी में लाने की व्यवस्था पर्याप्त नहीं है।

पिछले समाधान क्रम बाईटकोड उपकरण का उपयोग करने के लिए है, लेकिन यह ("hibernate.ejb.use_class_enhancer" सच के लिए सेटिंग चाल करना चाहिए जो लोग पूर्ण विकसित जेईई वातावरण में जेपीए प्रदाता के रूप में हाइबरनेट का उपयोग के लिए ही काम करेंगे इस तरह के मामले में: इकाई प्रबंधक विन्यास) या रनटाइम बुनाई करने के लिए कॉन्फ़िगर किए गए स्प्रिंग के साथ हाइबरनेट का उपयोग करें (यह कुछ पुराने एप्लिकेशन सर्वर पर प्राप्त करना मुश्किल हो सकता है)। इस मामले में @LazyToOne(LazyToOneOption.NO_PROXY) एनोटेशन भी आवश्यक है।

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