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();

DISTINCTdigunakake 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();