@OneToMany

All lectures for UZ purposes
Daraja, Dars
Mavjud

Jadval darajasidagi aloqalar

Qani keling, yana ikkita jadvalimizni ko'rib chiqaylik:

id name occupation salary age join_date
1 Ivanov Ivan Dasturchi 100000 25 2012-06-30
2 Petrov Pyotr Dasturchi 80000 23 2013-08-12
3 Ivanov Sergey Testlovchi 40000 30 2014-01-01
4 Rabinovich Moysha Direktor 200000 35 2015-05-12
5 Kirienko Anastasiya Ofis-menejer 40000 25 2015-10-10
6 Vasya Mushuk 1000 3 2018-11-11

Employee jadvali:

Bu jadvolda quyidagi ustunlar mavjud:

  • id INT
  • name VARCHAR
  • occupation VARCHA
  • salary INT
  • age INT
  • join_date DATE

Task jadvali esa xodimlar uchun vazifalarni o'z ichiga oladi:

id emploee_id name deadline
1 1 Frontend xatosini tuzatish 2022-06-01
2 2 Backend xatosini tuzatish 2022-06-15
3 5 Kofe sotib olish 2022-07-01
4 5 Kofe sotib olish 2022-08-01
5 5 Kofe sotib olish 2022-09-01
6 (NULL) Ofisni tozalash (NULL)
7 4 Hayotdan zavqlanish (NULL)
8 6 Hayotdan zavqlanish (NULL)

Bu jadvolda jami 4 ta ustun mavjud:

  • id – vazifa uchun noyob raqam (va jadvalda qator).
  • employee_id – employee jadvalidagi hodim IDsi, unga vazifa topshirilgan.
  • name – vazifaning nomi va izohi.
  • deadline – vazifani bajarish uchun vaqt.

Employee jadvalidagi bitta yozuvga task jadvalidagi ko'plab qatorlar murojaat qilishi mumkin. Bu jadval darajasidagi aloqa bittadan ko'pchilikka (one-to-many) deb ataladi.

Java-klasslar darajasidagi aloqa

Va bizning klasslarimiz, Employee klassi:


@Entity
@Table(name="user")
class Employee {
   @Column(name="id")
   public Integer id;
 
   @Column(name="name")
   public String name;
 
   @Column(name="occupation")
   public String occupation;
 
   @Column(name="salary")
   public Integer salary;
 
   @Column(name="join_date")
   public Date join;
}

Va EmployeeTask klassining ilk ko'rinishi:


@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;
 
   @Column(name="name")
   public String description;
 
   @Column(name="employee_id")
   public Integer employeeId;
 
   @Column(name="deadline")
   public Date deadline;
}

@OneToMany annotatsiyasi

Biz Entity-klasslar orasidagi aloqani boshqacha tashkil qilishimiz mumkin.

@ElementCollection annotatsiyasini eslaysanmi, uning yordamida biz ota-klassda qiz klasslar to'plamini yaratardik? Shunchaki shu kabi narsani @OneToMany annotatsiyasi yordamida amalga oshirishimiz mumkin. Faqat bu safar Employee klassi o'zgaradi:


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

@OneToMany annotatsiyasi yordamida biz Employee obyekti ko'plab EmployeeTask obyektlarini o'zida saqlay olishini ko'rsatdik. Shuningdek, @JoinColumn annotatsiyasi orqali task jadvalidagi qaysi ustunda Employee IDsi saqlanishini ko'rsatdik.

Ayni paytda EmployeeTask klassi odatda employee_id ustuniga ishora qiladigan maydonga ega emas. Misol:


@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;
 
   @Column(name="name")
   public String description;
 
   @Column(name="deadline")
   public Date deadline;
}

Employee_id maydoni xizmat maydoni hisoblanadi va uning qiymatini Hibernate boshqaradi.

So'rovlar misollari

Agar sen xodimga ma'lum bir task qo'shmoqchi bo'lsang, quyidagi kabi kod yozishing kerak:


EmployeeTask task1 = new EmployeeTask();
task1.description = "Muhim narsani bajarish";
session.persist(task1);
 
EmployeeTask task2 = new EmployeeTask();
task2.description = "Hech narsa qilmaslik";
session.persist(task2);
session.flush();
 
Employee director = session.find(Employee.class, 4);
director.tasks.add(task1);
director.tasks.add(task2);
 
session.update(director);
session.flush();

Avval biz ikkita EmployeeTask obyektini yaratamiz, ularni bazaga saqlaymiz va flush() metodini chaqiramiz, shunda INSERT amali bajariladi va obyektlarga ID tayinlanadi.

Keyin bazadan direktor topiladi, uning tasks maydonidan foydalanib unga ikki vazifa qo'shamiz. Keyin direktorni bazaga saqlaymiz. Shundan so'ng yangi task jadvallarida employee_id ustunida 4 qiymati paydo bo'ladi – employee jadvalidagi direktor IDsi.

Muvofiq! Baza jadvallari @ManyToOne va @OneToMany annotatsiyalari uchun bir xil. Lekin, Java-klasslar shu jadvallar uchun boshqacha.

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