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.
GO TO FULL VERSION