दिलचस्प पोस्ट
Rprofile.site में .libpaths का उपयोग करने के लिए R डिफ़ॉल्ट लायब्रेरी पथ को बदलने से काम करने में विफल रहता है सी # में यूआरएल से एक फाइल कैसे डाउनलोड करें? SQL सर्वर प्रबंधन स्टूडियो 2008 में "उत्पन्न स्क्रिप्ट" कार्य को कैसे स्वचालित कर सकता हूं? प्रणाली में अंतर जावा में से बाहर निकलें (0), System.exit (-1), System.exit (1) क्या सी # कोडिंग मानकों / सर्वोत्तम अभ्यास दस्तावेजों के विकास के लिए कोई सुझाव हैं? एक्सेल VBA – खाली पंक्तियाँ हटाएं मेरे ऐप के लिए फ़ाइल साझाकरण को कैसे सक्षम किया जा सकता है? com.android.support.appcompat- v7:22 और com.android.support:recyclerview- v7:21.1.2 को हल करने में विफल अभिगम / प्रक्रिया (नेस्टेड) ​​ऑब्जेक्ट्स, एरेज़ या जेएसओएन प्रत्येक समूह में अंतिम रिकॉर्ड प्राप्त करना PHP प्रोजेक्ट में सहायक पैटर्न को स्टोर करने, पहुंचने और व्यवस्थित करने के लिए क्या पैटर्न मौजूद हैं? जावास्क्रिप्ट पायथन के ज़िप फ़ंक्शन के बराबर है उद्देश्य-सी में एक वर्ग के लिए निजी तरीकों को परिभाषित करने का सर्वोत्तम तरीका एक सामान्य प्रकार पैरामीटर पर एक स्थिर विधि कॉलिंग Cdecl कॉल अक्सर "मानक" पी / आग्रह सम्मेलन में क्यों बेमेल है?

जेपीए उत्सुक लाने में शामिल नहीं है

क्या है जेपीए के फ़ेच रणनीति नियंत्रण? मैं उत्सुक और आलसी के बीच कोई अंतर नहीं खोज सकता। दोनों मामलों में जेपीए / हाइबरनेट स्वचालित रूप से कई-से-एक रिश्तों में शामिल नहीं होता है

उदाहरण: व्यक्ति का एक भी पता है एक पता कई लोगों से संबंधित हो सकता है जेपीए एनोटेट की गई इकाई वर्ग की तरह दिखते हैं:

@Entity public class Person { @Id public Integer id; public String name; @ManyToOne(fetch=FetchType.LAZY or EAGER) public Address address; } @Entity public class Address { @Id public Integer id; public String name; } 

अगर मैं जेपीए क्वेरी का उपयोग करता हूं:

 select p from Person p where ... 

जेपीए / हाइबरनेट व्यक्ति तालिका से चयन करने के लिए एक एसक्यूएल क्वेरी उत्पन्न करता है, और फिर प्रत्येक व्यक्ति के लिए एक अलग पता क्वेरी:

 select ... from Person where ... select ... from Address where id=1 select ... from Address where id=2 select ... from Address where id=3 

बड़े परिणाम सेट के लिए यह बहुत बुरा है अगर 1000 लोग हैं तो 1001 प्रश्नों (1 व्यक्ति से और 1000 पते से अलग) उत्पन्न करता है। मुझे यह पता है क्योंकि मैं MySQL की क्वेरी लॉग को देख रहा हूं। यह मेरी समझ थी कि पते के आनयन के लिए उत्सुक प्रकार की स्थापना के कारण जेपीए / हाइबरनेट एक जुड़ने के साथ स्वचालित रूप से पूछताछ करेगा। हालांकि, फेच प्रकार की परवाह किए बिना, यह अभी भी संबंधों के लिए अलग-अलग प्रश्न उत्पन्न करता है।

जब मैं स्पष्ट रूप से इसमें शामिल होने के लिए कहता हूं तो वास्तव में इसमें शामिल होता है:

 select p, a from Person p left join p.address a where ... 

क्या मुझसे कोई चूक हो रही है? अब मुझे हर क्वेरी में कोड सौंप दिया गया है जिससे कि यह कई-से-एक रिश्तों में शामिल हो गया। मैं हाइबरनेट के जेपीए कार्यान्वयन MySQL के साथ कर रहा हूँ

संपादित करें: ऐसा प्रतीत होता है (देखें और यहां हाइबरनेट FAQ देखें) कि FetchType जेपीए क्वेरीज़ को प्रभावित नहीं करता है तो मेरे मामले में मैंने इसे स्पष्ट रूप से शामिल होने के लिए कहा है।

वेब के समाधान से एकत्रित समाधान "जेपीए उत्सुक लाने में शामिल नहीं है"

जेपीए फेच रणनीति का चयन करने के लिए मैपिंग एनोटेशन पर कोई विनिर्देश प्रदान नहीं करता है सामान्यत: नीचे दिए गए तरीकों में से किसी भी एक से संबंधित संस्थाओं को प्राप्त किया जा सकता है

  • SELECT => रूट संस्थाओं के लिए एक क्वेरी + संबंधित मैप इकाई के लिए एक क्वेरी / प्रत्येक रूट इकाई = (एन + 1) प्रश्नों का संकलन
  • SUBSELECT => रूट संस्थाओं के लिए एक क्वेरी + संबंधित मैप इकाई के लिए दूसरी क्वेरी / पहली क्वेरी = 2 प्रश्नों में प्राप्त सभी रूट संस्थाओं का संग्रह
  • JOIN => दोनों रूट संस्थाओं और उनके सभी मैप इकाई / संग्रह = 1 क्वेरी लाने के लिए एक क्वेरी

तो SELECT और JOIN दो चरम सीमाएं हैं और SUBSELECT बीच में आता है एक अपने डोमेन मॉडल के आधार पर उपयुक्त रणनीति चुन सकता है।

डिफ़ॉल्ट रूप से SELECT का उपयोग दोनों JPA / EclipseLink और हाइबरनेट द्वारा किया जाता है। इसका उपयोग करके इसे ओवरराइड किया जा सकता है:

 @Fetch(FetchMode.JOIN) @Fetch(FetchMode.SUBSELECT) 

हाइबरनेट में यह SELECT मोड को स्पष्ट रूप से @Fetch(FetchMode.SELECT) का उपयोग करने की अनुमति देता है जो बैच आकार जैसे बैच आकार @BatchSize(size=10) का उपयोग करके ट्यून किया जा सकता है।

एक्लिप्स्लिंक में संबंधित टिप्पणियां इस प्रकार हैं:

 @JoinFetch @BatchFetch 

"एमएक्ससी" सही है। fetchType बस निर्दिष्ट करता है कि जब संबंध हल हो जाए।

बाहरी जोड़ने का उपयोग करके उत्सुक लोडिंग को अनुकूलित करने के लिए आपको जोड़ना होगा

 @Fetch(FetchMode.JOIN) 

अपने क्षेत्र में यह हाइबरनेट विशिष्ट एनोटेशन है

FetchType विशेषता नियंत्रण करती है कि प्राथमिक इकाई को प्राप्त होने पर एनोटेटेड फ़ील्ड तत्काल प्राप्त हो जाए या नहीं। यह जरूरी नहीं है कि फ़ेच विवरण का निर्माण कैसे किया जाता है, वास्तविक एसक्यूएल कार्यान्वयन प्रदाता पर निर्भर करता है जिसे आप टिपलिंक / हाइबरनेट आदि का उपयोग कर रहे हैं।

यदि आप fetchType=EAGER सेट fetchType=EAGER इसका अर्थ है कि एनोटेटेड फ़ील्ड एक ही समय में इकाई के अन्य फ़ील्ड के रूप में इसके मूल्यों से आबादी है। इसलिए यदि आप एक इकाई प्रबंधक को अपने व्यक्ति के ऑब्जेक्ट को खोलते हैं और फिर इकाई प्रबंधक को बंद करते हैं, तो बाद में एक व्यक्ति बनाते हैं। एडेडर फेंक दिया गया आलसी लोड अपवाद उत्पन्न नहीं करेगा।

यदि आप fetchType=LAZY सेट करते हैं तो फ़ील्ड केवल तब पहुंच जाती है जब इसे एक्सेस किया जाता है। यदि आपने इकाई प्रबंधक को बंद कर दिया है तो एक आलसी लोड अपवाद फेंक दिया जाएगा यदि आप एक व्यक्ति करते हैं। फ़ील्ड को लोड करने के लिए आपको इकाई को वापस em.merge () के साथ एक entitymangers संदर्भ में रखने की आवश्यकता है, फिर फ़ील्ड का उपयोग करें और फिर इकाई प्रबंधक को बंद करें।

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

प्रश्न के दूसरे भाग के लिए – अनुकूलित एसक्यूएल उत्पन्न करने के लिए कैसे सीतनिद्रा में होना चाहिए?

सीतनिद्रा में होना आपको संकेत देने के लिए सबसे कुशल क्वेरी का निर्माण कैसे करना चाहिए, लेकिन मुझे संदेह है कि आपके टेबल निर्माण में कुछ गड़बड़ है क्या तालिकाओं में संबंध स्थापित है? सीतनिद्रा में होना तय किया हो सकता है कि एक साधारण क्वेरी जल्दी से जुड़ने की संभावना होगी, खासकर अगर अनुक्रमणिका आदि गायब हो।

इसके साथ प्रयास करें:

 select p from Person p left join FETCH p.address a where... 

यह JPA2 / EclipseLink के समान मेरे लिए काम करता है, लेकिन ऐसा लगता है कि यह सुविधा JPA1 में भी मौजूद है :

यदि आप हाइबरनेट के बजाय ईक्लिप्स लिंक उपयोग करते हैं तो आप "क्वेरी संकेत" द्वारा अपने प्रश्नों को अनुकूलित कर सकते हैं। एक्लिप्स् विकी से इस आलेख को देखें: एक्लिप्स लिंक / उदाहरण / जेपीए / क्वेरी ऑप्टिमाइज़ेशन

"पढ़ना पढ़ना" के बारे में एक अध्याय है

में शामिल होने के लिए आप कई चीजें (ईक्लीपसेल्च का उपयोग कर) कर सकते हैं

  • jpql में आप छोड़ सकते हैं फेच में शामिल हो

  • नाम क्वेरी में आप क्वेरी इशारा निर्दिष्ट कर सकते हैं

  • TypedQuery में आप ऐसा कुछ कह सकते हैं

    query.setHint("eclipselink.join-fetch", "e.projects.milestones");

  • वहाँ भी बैच fetch संकेत है

    query.setHint("eclipselink.batch", "e.address");

देख

http://java-persistence-performance.blogspot.com/2010/08/batch-fetching-optimizing-object-graph.html

मुझे उस अपवाद के साथ यह समस्या थी जो व्यक्ति वर्ग में एक एम्बेडेड कुंजी वर्ग था मेरा स्वयं का समाधान उन क्वेरी में शामिल होने और हटाने में था

@Fetch(FetchMode.JOIN)

मेरा एम्बेडेड आईडी वर्ग:

 @Embeddable public class MessageRecipientId implements Serializable { @ManyToOne(targetEntity = Message.class, fetch = FetchType.LAZY) @JoinColumn(name="messageId") private Message message; private String governmentId; public MessageRecipientId() { } public Message getMessage() { return message; } public void setMessage(Message message) { this.message = message; } public String getGovernmentId() { return governmentId; } public void setGovernmentId(String governmentId) { this.governmentId = governmentId; } public MessageRecipientId(Message message, GovernmentId governmentId) { this.message = message; this.governmentId = governmentId.getValue(); } } 

मेरे लिए दो चीजें होती हैं

सबसे पहले, क्या आप सुनिश्चित हैं कि आपको पता करने के लिए बहुत सारे लोग हैं? इसका अर्थ है कि कई लोगों का एक ही पता होगा। अगर उनमें से एक के लिए इसे संपादित किया गया है, तो इसे सभी के लिए संपादित किया जाएगा क्या यह आपका इरादा है? समय के 99% पते "निजी" हैं (इस अर्थ में कि वे केवल एक ही व्यक्ति के हैं)।

दूसरे, क्या आपके पास व्यक्ति इकाई पर कोई अन्य उत्सुक संबंध है? अगर मुझे सही ढंग से याद आती है, हाइबरनेट एक इकाई पर केवल एक उत्सुक रिश्ते को संभाल सकता है, लेकिन यह संभवतः पुरानी जानकारी है।

मैं कहता हूं कि क्योंकि यह समझना चाहिए कि यह कैसे काम करना चाहिए I