Hubungan Tabel-Tingkat

Ayo ndeleng loro tabel maneh:

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
  • pendhudhuk VARCHA
  • gaji INT
  • umur INT
  • join_date DATE

Lan iki carane tabel tugas , sing ngemot tugas kanggo karyawan, katon kaya:

id id_karyawan 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 minangka nomer unik saka tugas (lan baris ing tabel).
  • employee_id - ID karyawan saka meja pegawe sing tugas diutus kanggo.
  • jeneng - jeneng lan gambaran saka tugas.
  • deadline - wektu kang tugas kudu rampung.

Entri siji ing tabel karyawan bisa dirujuk dening akeh larik ing tabel tugas. Hubungan tingkat meja kasebut diarani siji-kanggo - akeh.

Sesambungan karo tataran kelas Jawa

Lan kelas kita, kelas Karyawan :

@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;
}

Lan kelas EmployeeTask ing wangun asli:

@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 anotasi

Kita bisa ngatur komunikasi antarane kelas Entitas kanthi cara sing beda.

Elinga anotasi @ElementCollection sing digunakake kanggo nggawe koleksi obyek anak ing kelas induk? Ana sing padha bisa ditindakake kanthi anotasi @OneToMany . Mung wektu iki, kelas Karyawan bakal diganti :

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

Nggunakake anotasi @OneToMany , kita nuduhake yen obyek kasebutpegawebisa nyimpen akeh obyek EmployeeTask . Uga, nggunakake anotasi @JoinColumn , kita nuduhake ing kolom ing tabel tugas id obyek disimpenpegawe.

Nanging, kelas EmployeeTask biasane ora ngemot kolom sing nuduhake kolom employee_id. Tuladha:

@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String description;

   @Column(name="deadline")
   public Date deadline;
}

Kolom employee_id dianggep minangka kolom layanan lan nilai kasebut dikontrol dening Hibernate.

Nyuwun conto

Yen sampeyan pengin nambah sawetara tugas kanggo sawetara buruh, sampeyan kudu nulis kode kaya iki:

EmployeeTask task1 = new EmployeeTask();
task1.description = "Do Something Important";
session.persist(task1);

EmployeeTask task2 = new EmployeeTask();
task2.description = "Nothing to do";
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();

Kaping pisanan, kita nggawe rong obyek EmployeeTask , simpen ing database, lan nelpon metode flush () supaya operasi INSERT ditindakake lan obyek kasebut duwe ID.

Banjur kita nemokake direktur ing database, njupuk lapangan tugas saka dheweke lan nambah rong tugas kanggo dheweke. Banjur kita nyimpen direktur menyang database. Sawise iku, nilai 4 bakal katon ing database kanggo tugas anyar ing kolom employee_id - id direktur ing tabel karyawan.

Penting! Tabel ing database padha kanggo @ManyToOne lan @OneToMany anotasi . Nanging kelas Jawa kanggo tabel iki beda.