जेपीए की भ्रूण रणनीति क्या वास्तव में नियंत्रित करती है? मैं उत्सुक और आलसी के बीच किसी भी अंतर का पता नहीं लगा सकता। दोनों मामलों में जेपीए / हाइबरनेट स्वचालित रूप से कई-से-एक रिश्तों में शामिल नहीं होता है।
उदाहरण: व्यक्ति का एक ही पता होता है। एक पता कई लोगों का हो सकता है। JPA एनोटेट निकाय वर्ग इस तरह दिखते हैं:
@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;
}
अगर मैं JPA क्वेरी का उपयोग करता हूं:
select p from Person p where ...
JPA / हाइबरनेट व्यक्ति तालिका से चयन करने के लिए एक SQL क्वेरी उत्पन्न करता है, और फिर प्रत्येक व्यक्ति के लिए एक अलग पता क्वेरी :
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
जेपीए प्रश्नों को प्रभावित नहीं करता है। इसलिए मेरे मामले में मैंने स्पष्ट रूप से इसमें शामिल होने के लिए कहा है।