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.
GO TO FULL VERSION