Hubungan Aras Meja

Mari lihat dua jadual kami sekali lagi:

ID nama pekerjaan gaji umur tarikh menyertai
1 Ivanov Ivan Pengaturcara 100000 25 30-06-2012
2 Petrov Petr Pengaturcara 80000 23 2013-08-12
3 Ivanov Sergey Penguji 40000 tiga puluh 2014-01-01
4 Rabinovich Moisha Pengarah 200000 35 12-05-2015
5 Kirienko Anastasia Pengurus pejabat 40000 25 2015-10-10
6 Vaska Kucing 1000 3 2018-11-11

meja pekerja:

Jadual ini mempunyai lajur berikut:

  • id INT
  • nama VARCHAR
  • pekerjaan VARCHA
  • gaji INT
  • umur INT
  • join_date DATE

Dan ini adalah bagaimana jadual tugas , yang mengandungi tugasan untuk pekerja, kelihatan seperti:

ID id_pekerja nama tarikh akhir
1 1 Betulkan pepijat pada bahagian hadapan 2022-06-01
2 2 Betulkan pepijat pada bahagian belakang 15-06-2022
3 5 Beli kopi 2022-07-01
4 5 Beli kopi 2022-08-01
5 5 Beli kopi 2022-09-01
6 (NULL) Bersihkan pejabat (NULL)
7 4 Nikmati kehidupan (NULL)
8 6 Nikmati kehidupan (NULL)

Jadual ini hanya mempunyai 4 lajur:

  • id ialah nombor unik tugasan (dan baris dalam jadual).
  • id_pekerja - ID pekerja daripada jadual pekerja di mana tugas itu diberikan.
  • nama - nama dan huraian tugas.
  • tarikh akhir - masa di mana tugas mesti diselesaikan.

Satu entri dalam jadual pekerja boleh dirujuk oleh banyak baris dalam jadual tugas. Hubungan peringkat jadual sedemikian dipanggil satu-ke -banyak.

Hubungan dengan tahap kelas Java

Dan kelas kami, kelas Pekerja :

@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 asalnya:

@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

Kami boleh mengatur komunikasi antara kelas Entiti dengan cara yang berbeza.

Ingat anotasi @ElementCollection yang kami gunakan untuk mencipta koleksi objek kanak-kanak dalam kelas induk? Sesuatu yang serupa boleh dilakukan dengan anotasi @OneToMany . Hanya kali ini, kelas Pekerja akan ditukar :

@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 bahawa objekpekerjaboleh menyimpan banyak objek EmployeeTask . Selain itu, menggunakan anotasi @JoinColumn , kami menunjukkan dalam lajur jadual tugas mana id objek disimpanpekerja.

Walau bagaimanapun, kelas EmployeeTask biasanya tidak mengandungi medan yang merujuk kepada lajur 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;
}

Medan employee_id dianggap sebagai medan perkhidmatan dan nilainya dikawal oleh Hibernate.

Minta contoh

Jika anda ingin menambah beberapa tugas kepada beberapa pekerja, maka anda perlu menulis kod 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();

Mula-mula, kami mencipta dua objek EmployeeTask , menyimpannya ke pangkalan data dan memanggil kaedah flush() supaya operasi INSERT dilakukan dan objek mempunyai ID.

Kemudian kami mencari pengarah dalam pangkalan data, ambil medan tugas daripadanya dan tambahkan dua tugas kepadanya. Kemudian kami menyimpan pengarah ke pangkalan data. Selepas itu, nilai 4 akan muncul dalam pangkalan data untuk tugasan baharu dalam lajur employee_id - id pengarah dalam jadual pekerja.

Penting! Jadual dalam pangkalan data adalah sama untuk anotasi @ManyToOne dan @OneToMany . Tetapi kelas Java untuk jadual ini berbeza.