2.1 आणण्याचा पर्याय
हायबरनेटच्या विकसकांना बर्याच काळापासून बाल घटक लोड करण्याच्या समस्येबद्दल माहिती आहे. म्हणून त्यांनी पहिली गोष्ट केली ती म्हणजे भाष्यांमध्ये एक विशेष फेच@OneToMany
पॅरामीटर जोडणे , @ManyToMany
.
हे पॅरामीटर दोन मूल्ये घेऊ शकते:
- उत्सुक
- आळशी
उदाहरण:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
फेच पॅरामीटर EAGER च्या बरोबरीचे असल्यास , जेव्हा पालक घटक लोड केला जातो, तेव्हा त्याच्या सर्व मूल घटक देखील लोड केले जातील. तसेच, हायबरनेट हे एका SQL क्वेरीमध्ये करण्याचा प्रयत्न करेल, एक भारी क्वेरी निर्माण करेल आणि सर्व डेटा एकाच वेळी आणेल.
फेच पॅरामीटरने LAZY हे मूल्य घेतल्यास , जेव्हा मूळ अस्तित्व लोड केले जाते, तेव्हा मूल अस्तित्व लोड केले जाणार नाही. त्याऐवजी, एक प्रॉक्सी ऑब्जेक्ट तयार केला जाईल.
या प्रॉक्सी ऑब्जेक्टच्या मदतीने, हायबरनेट या चाइल्ड एंटिटीच्या ऍक्सेसचा मागोवा घेईल आणि पहिल्यांदा ऍक्सेस केल्यावर ते मेमरीमध्ये लोड करेल.
आम्हाला टिप्पण्यांसह आमची परिस्थिती आठवत असल्यास:
@Entity
@Table(name="user")
class User {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
public List<Comment> comments;
}
मग तुमच्याकडे एक "चिकित निवड" आहे:
जर fetch = FetchType.EAGER
, नंतर हायबरनेट कोडच्या 1ल्या ओळीवर सर्व टिप्पण्या लोड करेल:
User user = session.get(User.class, 1); //load all comments here
List<Comment> comments = user.getComments();
जर fetch = FetchType.LAZY
, नंतर हायबरनेट कोडच्या दुसऱ्या ओळीवर सर्व टिप्पण्या लोड करेल:
User user = session.get(User.class, 1);
List<Comment> comments = user.getComments(); //load all comments here
तुम्ही आधीच अंदाज लावू शकता, तुमच्याकडे कोणताही पर्याय नसतो जेव्हा ते सर्व टिप्पण्या लोड करत नाही :)
2.2 डीफॉल्ट मूल्य
तुम्ही ... भाष्यासाठी फेच पर्याय निर्दिष्ट न केल्यास @ManyTo
, हायबरनेट डीफॉल्ट मूल्ये वापरेल.
वेगवेगळ्या भाष्य प्रकारांसाठी ते थोडे वेगळे आहेत. भाष्यांसाठी @OneToOne
आणि @ManyToOne
उत्सुक आहे, भाष्यांसाठी @OneToMany
आणि @ManyToMany
आळशी आहे. हे लक्षात ठेवणे सोपे आहे - जर आपण एका ऑब्जेक्टचा संदर्भ घेतला तर ते पूर्णपणे लोड केले जाईल. आम्ही एखाद्या संग्रहाचा संदर्भ घेतल्यास, प्रथमच प्रवेश केल्यावर तो लोड केला जाईल.
2.3 @LazyCollection भाष्य
तुम्ही आधीच पाहिल्याप्रमाणे, संकलनासह काम करताना फेच पॅरामीटर जास्त मदत करत नाही. हायबरनेटच्या निर्मात्यांनी एक विशेष भाष्य जोडून याचे निराकरण करण्याचा प्रयत्न केला @LazyCollection
. हे सहसा असे लिहिले जाते:
@LazyCollection(LazyCollectionOption.TRUE)
संकलन फील्ड मॅप करताना तुम्हाला ते निर्दिष्ट करणे आवश्यक आहे:
@Entity
@Table(name="user")
class User {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.TRUE)
public List<Comment> comments;
}
या भाष्यात मूल्य पॅरामीटर आहे जे तीन मूल्यांपैकी एक घेऊ शकते:
- LazyCollectionOption. खरे
- LazyCollectionOption. असत्य
- LazyCollectionOption. अतिरिक्त
पहिले दोन पर्याय फेच पर्यायासारखेच आहेत.
पॅरामीटर वर सेट केले असल्यास LazyCollectionOption.TRUE
, याचा अर्थ असा की जेव्हा मूळ वापरकर्ता ऑब्जेक्ट लोड केला जातो तेव्हा टिप्पण्या फील्डची मूल्ये डेटाबेसमधून लोड केली जाणार नाहीत . टिप्पण्या फील्डमध्ये प्रथमच प्रवेश केल्यावर टिप्पणी प्रकारातील ऑब्जेक्ट लोड केले जातील. खरं तर, हे पॅरामीटरचे समतुल्य आहेFetchType.LAZY
पॅरामीटर वर सेट केले असल्यास LazyCollectionOption.FALSE
, याचा अर्थ असा की टिप्पण्या फील्डची मूल्ये मूळ वापरकर्ता ऑब्जेक्ट लोड करताना डेटाबेसमधून लोड केली जातील . टिप्पण्या फील्डमध्ये प्रथमच प्रवेश केल्यावर टिप्पणी प्रकारातील ऑब्जेक्ट लोड केले जातील. खरं तर, हे समतुल्य आहे FetchType.EAGER
.
GO TO FULL VERSION