2011-03-28 8 views
22

में शामिल हों मेरे पास एक उपयोगकर्ता इकाई इकाई देश इकाई के साथ मैप की गई है। उपयोगकर्ता खाता वर्ग में देश मानचित्रण इसहाइबरनेटेट चुनने का बयान जारी करें भले ही FetchMode =

@ManyToOne(fetch=FetchType.EAGER) 
@Fetch(FetchMode.JOIN) 
@JoinColumn(name="f_country_id", nullable=true, insertable=false, updatable=false) 
private Country country; 

भी fetchmode में शामिल हों, आग हाइबरनेट एक अलग एसक्यूएल चुनें देशों लाने के लिए के रूप में परिभाषित नहीं है की तरह है।

+0

क्या आपने इस समस्या को हल किया? स्वीकृत उत्तर ने आपकी मदद कैसे की? मुझे एक ही समस्या का सामना करना पड़ रहा है, लेकिन स्वीकृत उत्तर मदद नहीं करता है। –

+0

इसके सरल उत्सुक होने के लिए। आलसी इसे लोड करना बंद कर देगा। तो जवाब यहाँ सही है। छोटी पकड़ यह है कि जब आपके पास एन से एक रिश्ते है, तो यह काम नहीं करता है। तो हमें बाइटकोड वाद्ययंत्र और क्षेत्र गुण संशोधक के साथ जाना होगा। यद्यपि यह हाइबरनेट की एक विशेषता है। –

+0

समस्या, शीर्षक और सामग्री के सुझाव के रूप में समस्या, अनुरोधित fetch मोड 'जॉइन' होने पर 'EAGER' fetch प्रकार के साथ '@ ManyToOne' संबंध' के लिए 'SELECT' कथन जारी करने के लिए हाइबरनेट है। स्वीकृत उत्तर एनोटेशन से 'fetch = FetchType.EAGER' को निकालने के लिए कहता है, एक ऐसी क्रिया जो 'EAGER' के बाद से कुछ भी नहीं बदलेगी, एनोटेशन के लिए डिफ़ॉल्ट fetch प्रकार है; भले ही आप उत्तर को 'LAZY'' के साथ "EAGER' बदलें" के रूप में समझें, यह स्पष्ट नहीं करता है कि हाइबरनेट को 'SELECT' कथन क्यों जारी करते हैं जब इसे ऐसा करने का निर्देश नहीं दिया जाता है। –

उत्तर

19

fetch=FetchType.EAGER हटाएं। चुनिंदा वक्तव्यों को कैस्केड करने वाले ट्रिगर्स को उत्सुक करना।

+1

मुझे इसे उत्सुक होना चाहिए। क्या शामिल होने के साथ उत्सुक लाने का कोई तरीका है ...? –

+1

FetchMode.JOIN को बताकर चाल चलनी चाहिए। उत्सुक लोडिंग प्राप्त करने के लिए, FetchType.EAGER या FetchMode.JOIN का उपयोग करें, किसी का भी उपयोग करें, दोनों का उपयोग ओवर-मार है। पूर्व 'चयन' का उपयोग करता है जबकि उत्तरार्द्ध 'शामिल' का उपयोग करेगा। –

+2

समस्या का समाधान नहीं किया। यह अभी भी डेटाबेस में चुनिंदा बयानों को फायर कर रहा है। मैं निम्नलिखित का उपयोग कर रहा हूं: @ManyToOne \t @ फ़ेच (FetchMode।जॉइन) \t @ जॉइन कॉलम (नाम = "f_country_id", nullable = true, insertable = false, updatable = false) \t निजी देश देश; –

9

सतद्रू विश्वास ने पिछली टिप्पणी में जवाब दिया।

हाइबरनेट 3.x क्वेरी इंटरफ़ेस (सत्र.createQuery) का उपयोग करते समय FetchMode एनोटेशन को अनदेखा करता है, इसलिए इस मामले में आपको अपनी क्वेरी के भाग से INNER जॉइन फ़ेच क्लॉज जोड़ना होगा।

मानदंड इंटरफ़ेस हालांकि इस इंटरफेस का सही ढंग से उपयोग करेगा।

3

मैं सभी एपीआई (जेपीक्यूएल और मानदंडबिल्डर) में @ फ़ेच (FetchMode.JOIN) हाइबरनेट एटोटेशन का उपयोग करने का प्रयास करता हूं लेकिन काम नहीं करता था। केवल सेवा वर्ग काम ठीक में इस कोड:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<UserAccount > cq = cb.createQuery(UserAccount.class); 
Root<UserAccount> o = cq.from(UserAccount.class); 

o.fetch("country",JoinType.INNER); 

em.createQuery(cq.select(o)).getResultList(); 
0

मैं मापदंड का उपयोग कर रहा ग्राहकों को लाने के लिए क्वेरी।

public class PurchaseOrder 
{ 
    ..... 
    .....  
    @ManyToOne(fetch=FetchType.EAGER, optional=true) 
    @JoinColumn(name="ReportingCustomer_ID", nullable=true, insertable=false, updatable=false) 
    @Fetch(FetchMode.JOIN) 
    @NotFound(action=NotFoundAction.IGNORE) 
    public ReportingCustomer getReportingCustomer() 
    { 
     return reportingCustomer; 
    } 
} 

PurchaseOrder हो रही हालांकि यह एक वाम बाहरी में शामिल होता है, जैसा कि नीचे

select ... from PurchaseOrder this_ left outer join ReportingCustomer reportingc2_ 
on this_.ReportingCustomer_ID=reportingc2_.ReportingCustomer_ID 
where ... 
  1. जब ReportingCustomer में एक प्रविष्टि है - यह केवल ऊपर क्वेरी सक्रिय करता है।
  2. जब रिपोर्टिंग ग्राहक में उस रिकॉर्ड के लिए कोई प्रविष्टि नहीं है - यह प्रत्येक खरीदकर्ता (एम + 1) प्रश्नों के लिए एक क्वेरी को सक्रिय करता है।

मैं डीबी से कनेक्ट करने के लिए "प्रोग्रेस" ड्राइवर का उपयोग करता हूं। मुझे यकीन नहीं है कि यह केवल परिदृश्य में एम + 1 प्रश्न क्यों निकालता है 2.

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है: 'FetchMode.JOIN' काम करता है क्योंकि यह एक पाता है, फिर यह' चयन 'के साथ शुरू होता है। क्या आपको एक समाधान मिला? –

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