2.1 Nyambung ing tingkat meja
Kita wis ndeleng carane Hibernate nyimpen koleksi ing tabel tambahan. Saiki ayo dipikirake carane ngatur hubungan antarane tabel lengkap sing nyimpen kelas Entitas nyata.
Ana papat jinis hubungan antarane kelas Entitas ing Hibernate:
- siji - siji
- siji -kanggo- akeh
- akeh -kanggo- siji
- akeh -kanggo- akeh
Lan kita bakal miwiti analisis kanthi pilihan sing paling gampang - akeh -kanggo- siji .
Sampeyan wis nemokake hubungan kaya ing antarane tabel ing SQL. Iki biasane katon kaya:
id | jeneng | pendhudhukan | gaji | umur | join_date |
---|---|---|---|---|---|
1 | Iwan Iwan | Programmer | 100000 | 25 | 30-06-2012 |
2 | Petrov Petruk | Programmer | 80000 | 23 | 2013-08-12 |
3 | Ivanov Sergey | Tester | 40000 | telung puluh | 2014-01-01 |
4 | Rabinovich Moisha | direktur | 200000 | 35 | 2015-05-12 |
5 | Kirienko Anastasia | Kantor manager | 40000 | 25 | 10-10-2015 |
6 | Vaska | Cat | 1000 | 3 | 2018-11-11 |
Tabel karyawan:
Tabel iki nduweni kolom ing ngisor iki:
- id INT
- jeneng VARCHAR
- pendhudhukan VARCHAR
- gaji INT
- umur INT
- join_date DATE
Lan iki carane tabel tugas , sing ngemot tugas kanggo karyawan, katon kaya:
id | id_pegawe | jeneng | deadline |
---|---|---|---|
1 | 1 | Ndandani bug ing frontend | 2022-06-01 |
2 | 2 | Ndandani bug ing backend | 2022-06-15 |
3 | 5 | Tuku kopi | 2022-07-01 |
4 | 5 | Tuku kopi | 2022-08-01 |
5 | 5 | Tuku kopi | 2022-09-01 |
6 | (NULL) | Ngresiki kantor | (NULL) |
7 | 4 | Seneng urip | (NULL) |
8 | 6 | Seneng urip | (NULL) |
Tabel iki mung nduweni 4 kolom:
- id - nomer tugas unik (lan larik ing tabel);
- employee_id - ID karyawan saka meja karyawan sing tugas ditugasake;
- jeneng - jeneng lan deskripsi tugas;
- deadline - wektu kang tugas kudu rampung.
We ndeleng sing akeh larik ing meja tugas bisa ngrujuk menyang entri siji ing meja pegawe. Sesambungan tingkat meja kasebut diarani many-to -one.
2.2 Gayut kaliyan tataran kelas Jawi
Saliyane komunikasi ing tingkat meja, sampeyan uga bisa ngatur komunikasi ing tingkat kelas Entitas ing Hibernate. Iki ditindakake kanthi anotasi @ManyToOne
.
Nanging pisanan, ayo nggawe rong kelas: EmployeeTask lan EmployeeTask :
@Entity
@Table(name="employee")
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;
}
Lan kelas kapindho kanggo nyimpen proyek karyawan:
@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;
}
Kabeh iku apik karo kelas iki, nanging ora ana hubungan antarane wong-wong mau sing bakal nggambarake kasunyatan sing lapangan employeeId kelas EmployeeTask nuduhake lapangan id saka kelas Employee. Wektu kanggo ndandani
2.3 @ManyToOne anotasi.
Kaping pisanan, ing Jawa kita wis biasa ngoperasikake obyek (lan referensi obyek) tinimbang id. Dadi pisanan, tinimbang lapangan employeeId ing kelas EmployeeTask, ayo nuding obyek saka jinis Employee. Mangkene tampilan kelas anyar kita:
@Entity
@Table(name="task")
class EmployeeTask {
@Column(name="id")
public Integer id;
@Column(name="name")
public String description;
@ManyToOne
@JoinColumn(name = "employee_id")
public Employee employee;
@Column(name="deadline")
public Date deadline;
}
Kanthi bantuan saka anotasi @ManyToOne
, kita wis nuduhake manawa akeh obyek EmployeeTask bisa ngrujuk menyang siji obyek saka jinis Employee. Uga, nggunakake anotasi @JoinColumn
, kita dituduhake ing kolom ing tabel id saka obyek Karyawan sing disimpen.
2.4 Nyuwun conto
Lan saiki ayo nuduhake sawetara conto carane Hibernate bisa nggarap kelas sing gegandhengan.
Skenario siji
Ayo nulis pitakon kanggo ngerteni kabeh tugas sing wis ditugasake kanggo pangguna tartamtu. Mangkene carane pitakon iki katon ing HQL:
from EmployeeTask where employee.name = "Ivan Ivanovich"
Sampeyan mung bisa ngrujuk menyang lapangan kelas gumantung liwat titik. Iku banget nyaman. Nanging ayo isih nulis pitakon iki ing wangun kode Jawa:
String hql = "from EmployeeTask where employee.name = :username";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter("username", "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();
Skenario loro
Ayo nulis pitakon sing ngasilake dhaptar karyawan sing duwe tugas telat. Tugas wis telat yen tenggat wektune wis kepungkur. Mangkene apa pitakon kasebut ing SQL:
SELECT DISTINCT employee.*
FROM task JOIN employee ON task.employee_id = employee.id
WHERE task.deadline < CURDATE();
DISTINCT
digunakake amarga ana akeh tugas sing ditugasake kanggo siji pangguna.
Lan saiki ayo nulis pitakon sing padha ing HQL:
select distinct employee from EmployeeTask where deadline < CURDATE();
Karyawan ing pitakon iki minangka lapangan kelas EmployeeTask
Kahanan telu
Nemtokake kabeh tugas sing ora ditugasake menyang direktur. Pitakonan SQL bakal katon kaya iki:
UPDATE task SET employee_id = 4 WHERE employee_id IS NULL
Lan saiki ayo nulis pitakon sing padha ing HQL:
update EmployeeTask set employee = :user where employee is null
Pitakonan pungkasan yaiku sing paling angel. We kudu pass ID direktur, nanging kelas EmployeeTask ora ngemot lapangan ngendi kita bisa nulis id, tinimbang ngemot lapangan Employee ngendi kita kudu nemtokake referensi kanggo obyek saka jinis Employee.
Employee director = session.get(Employee.class, 4);
String hql = "update EmployeeTask set employee = :user where employee is null";
Query<EmployeeTask> query = session.createQuery(hql, EmployeeTask.class);
query.setParameter("user", director);
query.executeUpdate();