hibernate
प्रदर्शन सुधारना
खोज…
EAGER लाने के प्रकार का उपयोग न करें
हाइबरनेट दो प्रकार के भ्रूण का उपयोग कर सकता है जब आप दो संस्थाओं के बीच संबंध को मैप कर रहे हैं: EAGER
और LAZY
।
सामान्य तौर पर, EAGER
प्रकार एक अच्छा विचार नहीं है, क्योंकि यह जेपीए को हमेशा डेटा लाने के लिए कहता है, तब भी जब यह डेटा आवश्यक नहीं है।
उदाहरण के अनुसार, यदि आपके पास एक Person
इकाई है और इस तरह के Address
के साथ संबंध हैं:
@Entity
public class Person {
@OneToMany(mappedBy="address", fetch=FetchType.EAGER)
private List<Address> addresses;
}
जब भी आप किसी Person
क्वेरी करते हैं, तो इस Person
के Address
की सूची भी वापस कर दी जाएगी।
इसलिए, अपनी इकाई को मैप करने के बजाय:
@ManyToMany(mappedBy="address", fetch=FetchType.EAGER)
उपयोग:
@ManyToMany(mappedBy="address", fetch=FetchType.LAZY)
भुगतान करने के लिए एक और बात ध्यान रिश्तों है @OneToOne
और @ManyToOne
। ये दोनों डिफ़ॉल्ट रूप से ईएजीईआर हैं। इसलिए, यदि आप अपने आवेदन के प्रदर्शन के बारे में चिंतित हैं, तो आपको इस प्रकार के संबंध के लिए लाने की आवश्यकता है:
@ManyToOne(fetch=FetchType.LAZY)
तथा:
@OneToOne(fetch=FetchType.LAZY)
विरासत के बजाय रचना का उपयोग करें
हाइबरनेट में वंशानुक्रम की कुछ रणनीतियाँ हैं। JOINED
विरासत प्रकार एक बच्चे इकाई और मूल इकाई के बीच में शामिल हों है।
इस दृष्टिकोण के साथ समस्या यह है कि हाइबरनेट हमेशा विरासत में सभी शामिल तालिकाओं का डेटा लाती है।
उदाहरण के अनुसार, यदि आपके पास JOINED
विरासत प्रकार के उपयोग से Bicycle
और MountainBike
:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Bicycle {
}
तथा:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class MountainBike extends Bicycle {
}
MountainBike
को हिट करने वाली कोई भी JPQL क्वेरी Bicycle
डेटा लाएगी, जैसे SQL क्वेरी बनाना:
select mb.*, b.* from MountainBike mb JOIN Bicycle b ON b.id = mb.id WHERE ...
यदि आपके पास Bicycle
लिए एक अन्य माता-पिता हैं (जैसे कि Transport
, उदाहरण के लिए), तो यह उपरोक्त क्वेरी अतिरिक्त माता-पिता से भी इस माता-पिता का डेटा लाएगी।
जैसा कि आप देख सकते हैं, यह एक प्रकार का EAGER
मैपिंग भी है। आपके पास इस वंशानुक्रम रणनीति का उपयोग करके केवल MountainBike
तालिका का डेटा लाने का विकल्प नहीं है।
प्रदर्शन के लिए सबसे अच्छा उपयोग विरासत के बजाय रचना है।
इसे पूरा करने के लिए, आप एक फील्ड bicycle
लिए MountainBike
इकाई की मैपिंग कर सकते हैं:
@Entity
public class MountainBike {
@OneToOne(fetchType = FetchType.LAZY)
private Bicycle bicycle;
}
और Bicycle
:
@Entity
public class Bicycle {
}
अब प्रत्येक क्वेरी डिफ़ॉल्ट रूप से केवल MountainBike
डेटा लाएगी।