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