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.