Relasyon sa Antas ng Talahanayan
Tingnan natin muli ang aming dalawang talahanayan:
id | pangalan | hanapbuhay | suweldo | edad | Sumali sa date |
---|---|---|---|---|---|
1 | Ivanov Ivan | Programmer | 100000 | 25 | 2012-06-30 |
2 | Petrov Petr | Programmer | 80000 | 23 | 2013-08-12 |
3 | Ivanov Sergey | Tester | 40000 | tatlumpu | 2014-01-01 |
4 | Rabinovich Moisha | Direktor | 200000 | 35 | 2015-05-12 |
5 | Kirienko Anastasia | Tagapamahala ng Opisina | 40000 | 25 | 2015-10-10 |
6 | Vaska | Pusa | 1000 | 3 | 2018-11-11 |
talahanayan ng empleyado:
Ang talahanayang ito ay may mga sumusunod na column:
- id INT
- pangalan VARCHAR
- hanapbuhay VARCHA
- suweldo INT
- edad INT
- join_date DATE
At ganito ang hitsura ng talahanayan ng gawain , na naglalaman ng mga gawain para sa mga empleyado:
id | emploee_id | pangalan | deadline |
---|---|---|---|
1 | 1 | Ayusin ang isang bug sa frontend | 2022-06-01 |
2 | 2 | Ayusin ang isang bug sa backend | 2022-06-15 |
3 | 5 | Bumili ng kape | 2022-07-01 |
4 | 5 | Bumili ng kape | 2022-08-01 |
5 | 5 | Bumili ng kape | 2022-09-01 |
6 | (WALA) | Linisin ang opisina | (WALA) |
7 | 4 | Masiyahan sa buhay | (WALA) |
8 | 6 | Masiyahan sa buhay | (WALA) |
Ang talahanayang ito ay may 4 na column lamang:
- Ang id ay ang natatanging bilang ng gawain (at mga hilera sa talahanayan).
- employee_id - ID ng empleyado mula sa talahanayan ng empleyado kung saan nakatalaga ang gawain.
- pangalan - ang pangalan at paglalarawan ng gawain.
- deadline - ang oras kung kailan dapat makumpleto ang gawain.
Ang isang entry sa talahanayan ng empleyado ay maaaring i-reference ng maraming mga hilera sa talahanayan ng gawain. Ang ganitong relasyon sa antas ng talahanayan ay tinatawag na one-to -many.
Relasyon sa antas ng klase ng Java
At ang aming mga klase, ang Employee class :
@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;
}
At ang klase ng EmployeeTask sa orihinal nitong anyo:
@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 anotasyon
Maaari naming ayusin ang komunikasyon sa pagitan ng mga klase ng Entity sa ibang paraan.
Tandaan ang @ElementCollection annotation na ginamit namin upang lumikha ng isang koleksyon ng mga child object sa parent class? Ang isang bagay na katulad ay maaaring gawin sa @OneToMany annotation . Sa pagkakataong ito lamang, ang klase ng Empleyado ay mababago :
@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>();
}
Gamit ang @OneToMany annotation , ipinahiwatig namin na ang objectempleadomaaaring mag-imbak ng maraming EmployeeTask object . Gayundin, gamit ang @JoinColumn annotation , ipinahiwatig namin kung saang column ng task table nakaimbak ang object idempleado.
Gayunpaman, ang klase ng EmployeeTask ay karaniwang hindi naglalaman ng field na tumutukoy sa column ng employee_id. Halimbawa:
@Entity
@Table(name="task")
class EmployeeTask {
@Column(name="id")
public Integer id;
@Column(name="name")
public String description;
@Column(name="deadline")
public Date deadline;
}
Ang field ng employee_id ay itinuturing na isang field ng serbisyo at ang halaga nito ay kinokontrol ng Hibernate.
Humiling ng mga halimbawa
Kung gusto mong magdagdag ng ilang gawain sa ilang manggagawa, kailangan mong magsulat ng code tulad nito:
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();
Una, gumawa kami ng dalawang EmployeeTask object , i-save ang mga ito sa database, at tawagan ang flush() method para maisagawa ang INSERT operation at may mga ID ang mga object.
Pagkatapos ay hanapin namin ang direktor sa database, kunin ang field ng mga gawain mula sa kanya at magdagdag ng dalawang gawain sa kanya. Pagkatapos ay i-save namin ang direktor sa database. Pagkatapos nito, lalabas ang value 4 sa database para sa mga bagong gawain sa column na employee_id - ang id ng direktor sa talahanayan ng empleyado.
Mahalaga! Ang mga talahanayan sa database ay pareho para sa @ManyToOne at @OneToMany annotation . Ngunit iba ang mga klase ng Java para sa mga talahanayang ito.
GO TO FULL VERSION