Hubungan Tingkat Tabel

Mari kita lihat lagi dua tabel kita:

pengenal nama pekerjaan gaji usia join_date
1 Ivanov Ivan Programmer 100000 25 30-06-2012
2 Petrov Petr Programmer 80000 23 12-08-2013
3 Ivanov Sergey Penguji 40000 tigapuluh 01-01-2014
4 Rabinovich Moisha Direktur 200000 35 12-05-2015
5 Kirienko Anastasia Manajer kantor 40000 25 10-10-2015
6 Vaska Kucing 1000 3 11-11-2018

tabel karyawan:

Tabel ini memiliki kolom berikut:

  • id INT
  • nama VARCHAR
  • pendudukan VARCHA
  • gaji INT
  • usia INT
  • TANGGAL_gabung _

Dan seperti inilah tampilan tabel tugas , yang berisi tugas untuk karyawan:

pengenal employee_id nama tenggat waktu
1 1 Perbaiki bug di frontend 01-06-2022
2 2 Perbaiki bug di backend 15-06-2022
3 5 Beli kopi 01-07-2022
4 5 Beli kopi 01-08-2022
5 5 Beli kopi 01-09-2022
6 (BATAL) Membersihkan kantor (BATAL)
7 4 Menikmati hidup (BATAL)
8 6 Menikmati hidup (BATAL)

Tabel ini hanya memiliki 4 kolom:

  • id adalah nomor unik dari tugas (dan baris dalam tabel).
  • employee_id - ID karyawan dari tabel karyawan tempat tugas diberikan.
  • nama - nama dan deskripsi tugas.
  • tenggat waktu - waktu dimana tugas harus diselesaikan.

Entri tunggal dalam tabel karyawan dapat direferensikan oleh banyak baris dalam tabel tugas. Hubungan tingkat tabel seperti itu disebut satu-ke -banyak.

Hubungan dengan level kelas Java

Dan kelas kami, 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;
}

Dan kelas EmployeeTask dalam bentuk aslinya:

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

anotasi @OneToMany

Kita dapat mengatur komunikasi antar class Entity dengan cara yang berbeda.

Ingat anotasi @ElementCollection yang kita gunakan untuk membuat kumpulan objek anak di kelas induk? Hal serupa dapat dilakukan dengan anotasi @OneToMany . Hanya saja kali ini class Employee akan diubah :

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

Menggunakan anotasi @OneToMany , kami menunjukkan bahwa objekkaryawandapat menyimpan banyak objek EmployeeTask . Juga, dengan menggunakan anotasi @JoinColumn , kami menunjukkan di kolom tabel tugas mana id objek disimpankaryawan.

Namun, class EmployeeTask biasanya tidak berisi field yang merujuk ke kolom employee_id. Contoh:

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

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

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

Bidang employee_id dianggap sebagai bidang layanan dan nilainya dikendalikan oleh Hibernate.

Minta contoh

Jika Anda ingin menambahkan beberapa tugas ke beberapa pekerja, maka Anda perlu menulis kode seperti ini:

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

Pertama, kita membuat dua objek EmployeeTask , menyimpannya ke database, dan memanggil metode flush() sehingga operasi INSERT dilakukan dan objek memiliki ID.

Kemudian kami menemukan direktur di database, mengambil bidang tugas darinya dan menambahkan dua tugas padanya. Kemudian kami menyimpan direktur ke database. Setelah itu, nilai 4 akan muncul di database untuk tugas baru di kolom employee_id - id direktur di tabel karyawan.

Penting! Tabel dalam database sama untuk anotasi @ManyToOne dan @OneToMany . Tetapi kelas Java untuk tabel ini berbeda.