6.1 सखोल अवलंबित्व व्यवस्थापन

आणि @OneToMany भाष्ये आणि यासारख्या आणखी काही उपयुक्त आणि मनोरंजक गोष्टी . त्या सर्वांकडे 4 सामान्यतः वापरलेले पर्याय आहेत:

  • cascade = CascadeType.ALL
  • orphanRemoval = खरे
  • fetch = FetchType.LAZY

आता आम्ही त्यांचे अधिक तपशीलवार विश्लेषण करू. आणि आम्ही सर्वात मनोरंजक - CascadeType सह प्रारंभ करू . हे पॅरामीटर निर्धारित करते की आपण मुख्य घटक बदलल्यास अवलंबून असलेल्या घटकांचे काय होईल.

या पॅरामीटरसाठी JPA तपशीलामध्ये खालील मूल्ये आहेत:

  • सर्व
  • कायम राहा
  • विलीन
  • काढून टाका
  • रिफ्रेश करा
  • वेगळे करा

तथापि, हायबरनेट हे तपशील आणखी तीन पर्यायांमध्ये विस्तृत करते:

  • प्रतिकृती
  • SAVE_UPDATE
  • लॉक

डेटाबेस आणि त्यांच्या कॉन्स्ट्रॅनिसमध्ये अर्थातच एक मजबूत समांतर आहे. तथापि, मतभेद देखील आहेत. हायबरनेट शक्य तितक्या डेटाबेससह वास्तविक कार्य लपविण्याचा प्रयत्न करते, म्हणून हे हायबरनेट कॅस्केड्स नेमके एंटिटी ऑब्जेक्ट्सबद्दल आहेत.

6.2 कॅसकेड प्रकार

कॅस्केड पॅरामीटर आश्रित वस्तूंचे मूळ (मुख्य ऑब्जेक्ट) बदलल्यास त्यांचे काय होईल याचे वर्णन करते. बर्‍याचदा, हे पॅरामीटर ऑब्जेक्ट अवलंबित्वांचे वर्णन करणारे भाष्यांसह वापरले जाते:

उदाहरण:

OneToOne(cascade = CascadeType.ALL)

किंवा यासारखे:

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})

हे स्वतंत्र भाष्य म्हणून देखील लिहिले जाऊ शकते:

@Cascade({ org.hibernate.annotations.CascadeType.ALL })

आता या भाष्यांचा अर्थ काय आहे याबद्दल अधिक बोलूया.

6.3 सर्व, कायम, विलीन करा

CascadeType.ALLयाचा अर्थ असा की आपण मूळ ऑब्जेक्टसह केलेल्या सर्व क्रिया त्याच्या अवलंबून असलेल्या वस्तूंसाठी पुनरावृत्ती केल्या पाहिजेत.

CascadeType.PERSISTयाचा अर्थ असा की जर आपण मूळ ऑब्जेक्ट डेटाबेसमध्ये सेव्ह केला, तर त्याच्या अवलंबित ऑब्जेक्ट्ससह तेच केले पाहिजे. उदाहरण:


@Entity
@Table(name="employee")
class Employee {
   @Column(name="id")
   public Integer id;
 
   @OneToOne(cascade = CascadeType.PERSIST, mappedBy="task")
   private EmployeeTask task;
}

या वर्गासह कार्य करण्याचे उदाहरणः


Employee director = new Employee();
EmployeeTask task = new EmployeeTask();
director.task = task;
 
session.persist(director);
session.flush();

आम्ही फक्त एम्प्लॉयी प्रकारातील ऑब्जेक्ट सेव्ह करतो, त्याचा अवलंबित ऑब्जेक्ट EmployeeTask डेटाबेसमध्ये आपोआप सेव्ह केला जाईल.

CascadeType.MERGEयाचा अर्थ असा की जर आपण डेटाबेसमध्ये पॅरेंट ऑब्जेक्ट अपडेट केले, तर ते त्याच्या अवलंबित ऑब्जेक्ट्ससह केले पाहिजे.

6.4 काढा, हटवा, विलग करा

CascadeType.REMOVEयाचा अर्थ असा की जर आपण डेटाबेसमधील मूळ ऑब्जेक्ट हटवला, तर त्याच्या अवलंबित ऑब्जेक्ट्ससह तेच केले पाहिजे.

CascadeType.DELETEअर्थ समान. हे समानार्थी शब्द आहेत. फक्त भिन्न वैशिष्ट्यांमधून.

CascadeType.DETACHयाचा अर्थ असा की जर आपण सेशनमधून पॅरेंट ऑब्जेक्ट काढून टाकला, तर त्याच्या अवलंबित ऑब्जेक्ट्ससह तेच केले पाहिजे. उदाहरण:


@Entity
@Table(name="employee")
class Employee {
   @Column(name="id")
   public Integer id;
 
   @OneToOne(cascade = CascadeType.DETACH, mappedBy="task")
   private EmployeeTask task;
}

या वर्गासह कार्य करण्याचे उदाहरणः


Employee director = new Employee();
EmployeeTask task = new EmployeeTask();
director.task = task;
director.task = task;
session.flush();
 
assertThat(session.contains(director)).isTrue();
assertThat(session.contains(task)).isTrue();
 
session.detach(director);
 
assertThat(session.contains(director)).isFalse();
assertThat(session.contains(task)).isFalse();

CascadeType.REFRESHआणि CascadeType.SAVE_UPDATEआपल्या अपेक्षेप्रमाणे कार्य करा - ते मूळ ऑब्जेक्टसह त्याच्या अवलंबून असलेल्या ऑब्जेक्टवर केलेल्या क्रियांची डुप्लिकेट करतात.

6.5 अनाथ काढण्याचा पर्याय

तसेच काहीवेळा आपण पॅरामीटरवर येऊ शकता orphan. अनाथ काढण्यासाठी हे लहान आहे. हे सुनिश्चित करण्यासाठी वापरले जाते की पालक घटकांशिवाय कोणतीही मूल संस्था नाहीत.

OneToOne(orphan = true)

हे पॅरामीटर सत्य वर सेट केले असल्यास, मूल अस्तित्व गायब झाल्यास हटविले जाईलसर्व दुवे. ते अगदी सारखे नाही Cascade.REMOVE.

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

समजा तुमच्याकडे वर्ग आहे:


@Entity
@Table(name="user")
class Employee {
   @Column(name="id")
   public Integer id;
 
   @OneToMany(cascade = CascadeType.ALL, orphan = true)
   @JoinColumn(name = "employee_id")
   private Set<EmployeeTask> tasks = new HashSet<EmployeeTask>();
}


Employee director = session.find(Employee.class, 4);
EmployeeTask task = director.tasks.get(0);
director.tasks.remove(task)
session.persist(director);
session.flush();

EmployeeTask ऑब्जेक्ट हटवला जाईल कारण त्यात कोणतेही संदर्भ शिल्लक नाहीत. त्याच वेळी, कोणीही मूळ ऑब्जेक्ट हटवला नाही.

6.6 आणण्याचा पर्याय

फेच पर्याय तुम्हाला अवलंबून असलेल्या वस्तू कशा लोड केल्या जातात हे नियंत्रित करण्याची परवानगी देतो. हे सहसा दोन मूल्यांपैकी एक घेते:

  • FetchType.LAZY
  • FetchType.EAGER

विविध त्रुटींसह हा एक अतिशय मनोरंजक विषय आहे, म्हणून मी वेगळ्या व्याख्यानात याबद्दल बोलणे चांगले आहे.