Kaskadli o'zgarishlar

All lectures for UZ purposes
Daraja , Dars
Mavjud

6.1 Chuqur bog'lanishni boshqarish

Va @OneToMany annotatsiyalar va ularga o'xshashlar haqida yana biroz foydali va qiziqarli narsalar. Ularning barchasida 4 ta tez-tez ishlatiladigan parametr mavjud:

  • cascade = CascadeType.ALL
  • orphanRemoval = true
  • fetch = FetchType.LAZY

Hozirda ularni batafsilroq ko'rib chiqamiz. Eng qiziqarli – CascadeType bilan boshlaymiz. Bu parametr bog'liq obyektlar bilan nima sodir bo'lishi kerakligini aniqlaydi, agar biz asosiy obyektni o'zgartirsak.

JPA spetsifikatsiyasida bu parametrning quyidagi qiymatlari mavjud:

  • ALL
  • PERSIST
  • MERGE
  • REMOVE
  • REFRESH
  • DETACH

Biroq, Hibernate bu spetsifikatsiyani yana uch variantga kengaytiradi:

  • REPLICATE
  • SAVE_UPDATE
  • LOCK

Bu yerda, albatta, ma'lumotlar bazasi va ularning CONSTRANIS bilan kuchli parallel bor. Ammo, ba'zi farqlar ham mavjud. Hibernate ma'lumotlar bazasi bilan haqiqiy ish jarayonini iloji boricha yashirishga harakat qiladi, shuning uchun bu Hibernate Cascades – bu aynan Entity-ob'ektlar haqida.

6.2 CascadeType

Parameter cascade bog'liq obyektlar bilan nima sodir bo'lishi kerakligini aniqlaydi, agar biz ularning asosiy (ota-ona obyekti) obyekti o'zgartirsak. Bu parametr ko'pincha ob'ektlarning bog'lanishini tasvirlaydigan annotatsiyalar bilan birga qo'llaniladi:

Misol:

OneToOne(cascade = CascadeType.ALL)

Yoki shunday:

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

Shuningdek, uni alohida annotatsiya shaklida yozish mumkin:

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

Endi bu annotatsiyalar nimani anglatishini batafsilroq gaplashamiz.

6.3 ALL, PERSIST, MERGE

CascadeType.ALL ota-ona obyekti bilan amalga oshirilayotgan barcha harakatlarni, uning bog'liq obyektlari uchun ham takrorlashni anglatadi.

CascadeType.PERSIST agar bazaga ota-ona obyektini saqlasak, xuddi shunday bog'liq obyektlari bilan ham amalga oshirishni anglatadi. Misol:


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

Ushbu class bilan ishlash misoli:


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

Biz faqat Employee turidagi obyektni saqlaymiz, bog'liq EmployeeTask obyekti avtomatik ravishda bazaga saqlanadi.

CascadeType.MERGE agar bazada ota-ona obyektini yangilasak, xuddi shunday bog'liq obyektlari bilan amalga oshirishni anglatadi.

6.4 REMOVE, DELETE, DETACH

CascadeType.REMOVE agar bazada ota-ona obyektini o'chirsak, xuddi shunday bog'liq obyektlari bilan amalga oshirishni anglatadi.

CascadeType.DELETE xuddi shu narsani anglatadi. Bu sinonimlar. Faqat turli spesifikatsiyalardan.

CascadeType.DETACH agar biz ota-ona obyektini sessiyadan o'chirsak, xuddi shunday bog'liq obyektlarini ham o'chirishni anglatadi. Misol:


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

Ushbu class bilan ishlash misoli:


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 va CascadeType.SAVE_UPDATE xuddi kutilganidek ishlaydi – ota-ona obyekti bilan amalga oshirilayotgan harakatlarni bog'liq obyektiga takrorlaydi.

6.5 Orphan removal parametri

Orphan parametrini ba'zida uchratgan bo'lishing mumkin. Bu Orphan removal atamasining qisqartmasi. U ota-ona obyektlarini yo'qolganida hech qanday bolalarsiz qoldirmaslik uchun ishlatiladi.

OneToOne(orphan = true)

Agar bu parametr true qilib qo'yilsa, bolalar obyektlar barcha havolalar yo'qolsa o'chiriladi. Bu Cascade.REMOVE bilan bir xil emas.

Senda bir necha ota-ona obyekt bir bolalar obyektga havola qilib turgan holat bo'lishi mumkin. Bu holda, u faqatgina barcha havolalar yo'qolganda o'chirilganida foydali bo'ladi.

Misol qilaylik, senga quyidagi class bor:


@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 obyekti o'chiriladi, chunki unga bog'lanish yo'q. Ota-ona obyektini esa hech kim o'chirmadi.

6.6 Fetch parametri

Fetch parametri bog'liq obyektlarning yuklash rejimlarini boshqarish imkonini beradi. Odatda, u ikki qiymatdan birini qabul qiladi:

  • FetchType.LAZY
  • FetchType.EAGER

Bu juda qiziqarli mavzu bo'lib, turli xil sirli tomonlariga ega, shuning uchun bu haqda alohida ma'ruzada gaplashaman.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION