LazyCollectionOption.EXTRA जाणून घेणे

परंतु LazyCollectionOption.EXTRA मूल्य हे सर्वात जास्त स्वारस्य आहे. आपण @LazyCollection भाष्याचे मूल्य म्हणून निर्दिष्ट केल्यास , नंतर हायबरनेट संग्रहातील घटक लोड होण्यास विलंब करेल.

आपण संग्रहातील घटकांची संख्या मिळविण्याचा प्रयत्न केल्यास:

User user = session.load(User.class, 1);
List<Comment> comments = user.getComments();
int count = commetns.size();

मग या सर्व कोडसाठी, हायबरनेट फक्त एक क्वेरी कार्यान्वित करेल:

SELECT COUNT(id) FROM comment WHERE user_id = 1;

तथापि, जर तुम्हाला संग्रहातून एक टिप्पणी मिळवायची असेल, उदाहरणार्थ क्रमांक 3:

User user = session.load(User.class, 1);
List<Comment> comments = user.getComments();
Comment comment = commetns.get(3);

मग प्रश्न उद्भवतो: हायबरनेटला सर्व घटक मेमरीमध्ये लोड केल्याशिवाय घटक तिसरा आहे हे कसे समजेल?

या समस्येचे निराकरण करण्यासाठी, टिप्पणी सारणीमध्ये एक अतिरिक्त स्तंभ बनविण्याचा प्रस्ताव आहे, जो टिप्पण्यांच्या संग्रहामध्ये टिप्पणीची क्रमिक संख्या संग्रहित करेल. आणि यासाठी तुम्हाला एक विशेष भाष्य आवश्यक आहे - @OrderColumn .

ते समाधान कसे दिसेल ते येथे आहे:

@Entity
@Table(name=”user”)
class User {
   @Column(name=”id”)
   public Integer id;

   @OneToMany(cascade = CascadeType.ALL)
   @LazyCollection(LazyCollectionOption.EXTRA)
   @OrderColumn(name = "order_id")
   public List<Comment> comments;
}

LazyCollectionOption.EXTRA चा मुख्य फायदा

आम्ही LazyCollectionOption.EXTRA चा सर्वात मजबूत फायदा पाहतो जेव्हा आम्ही ते @ManyToMany भाष्यासह निर्दिष्ट करतो . चला आमचे जुने प्रकरण घेऊ जेथे आमच्याकडे एक कर्मचारी आहे, एक कार्य आहे आणि आम्ही एका वापरकर्त्याला अनेक कार्ये सोपवू शकतो.

आमचे जावा वर्ग असे दिसतात:

कर्मचारी वर्ग :

@Entity
@Table(name=”employee”)
class Employee {
   @Column(name=”id”)
   public Integer id;

   @ManyToMany(cascade = CascadeType.ALL)
   @JoinTable(name="employee_task",
       	joinColumns=  @JoinColumn(name="employee_id", referencedColumnName="id"),
       	inverseJoinColumns= @JoinColumn(name="task_id", referencedColumnName="id") )
   @LazyCollection(LazyCollectionOption.EXTRA)
   private Set<EmployeeTask> tasks = new HashSet<EmployeeTask>();

}

आणि EmployeeTask वर्ग :

@Entity
@Table(name=”task”)
class EmployeeTask {
   @Column(name=”id”)
   public Integer id;

   @ManyToMany(cascade = CascadeType.ALL)
   @JoinTable(name="employee_task",
       	joinColumns=  @JoinColumn(name="task_id", referencedColumnName="id"),
       	inverseJoinColumns= @JoinColumn(name=" employee_id", referencedColumnName="id") )
   @LazyCollection(LazyCollectionOption.EXTRA)
   private Set<Employee> employees = new HashSet<Employee>();

}

आणि दिग्दर्शकाला कार्य जोडण्यासाठी, आपल्याला या कोडसारखे काहीतरी लिहावे लागेल:

Employee director = session.find(Employee.class, 4);
EmployeeTask task = session.find(EmployeeTask.class, 101);
task.employees.add(director);

session.update(task);
session.flush();

त्यामुळे, जर टास्क क्लासमधील कर्मचारी फील्डमध्ये LazyCollectionOption.EXTRA भाष्य असेल, तर कर्मचारी संकलन (टास्क वर्गाचे) आणि कार्य संकलन (कर्मचारी वर्गाचे) डेटाबेसमधून कधीही लोड केले जाणार नाही .

जेव्हा हा कोड अंमलात आणला जातो, तेव्हा कर्मचारी_टास्क सेवा सारणीमध्ये फक्त एक रेकॉर्ड घातला जाईल, जो तुम्हाला आठवत असेल, असे काहीतरी दिसते:

कर्मचारी_कार्य सारणी :
कर्मचारी_आयडी टास्क_आयडी
2 2
3
4
4
6 8
4 101

जोडलेली ओळ हिरव्या रंगात हायलाइट केली आहे. ही ओळ जोडण्यासाठी, आपल्याला डेटाबेसमधून संग्रह लोड करण्याची आवश्यकता नाही - हायबरनेट त्याशिवाय करेल. जेव्हा LazyCollectionOption.EXTRA डेटाबेससह काम मोठ्या प्रमाणात वेगवान करते तेव्हा हेच घडते.

N+1 समस्या

परंतु, अर्थातच, या मोडमध्ये एक नकारात्मक बाजू देखील आहे. उदाहरणार्थ, LazyCollectionOption.EXTRA भाष्य N+1 समस्या निर्माण करते .

तुम्ही तुमच्या वापरकर्त्याच्या सर्व टिप्पण्यांमधून जाण्याचे ठरविल्यास:

User user = session.load(User.class, 1);
List<Comment> comments = user.getComments();
for (Comment comment : comments) {
    System.out.println(comment);
}

नंतर हायबरनेट प्रत्येक टिप्पणी ऑब्जेक्टसाठी स्वतंत्र विनंतीवर कार्यान्वित करेल. आणि सर्व टिप्पण्यांची संख्या मिळविण्यासाठी आणखी एक अतिरिक्त क्वेरी. हे कोड लक्षणीयरीत्या कमी करू शकते.

जर तुमच्या वापरकर्त्याच्या 1000 टिप्पण्या असतील, तर हा कोड कार्यान्वित करण्यासाठी हायबरनेट डेटाबेसमध्ये 1001 क्वेरी करेल, जरी ते एकासह करू शकते. जर तुम्हाला आधीच माहित असेल की तुम्हाला या वर्गाच्या सर्व वस्तूंची आवश्यकता असेल.