Relation på tabelniveau

Lad os se på vores to tabeller igen:

id navn beskæftigelse løn alder join_date
1 Ivanov Ivan Programmer 100.000 25 2012-06-30
2 Petrov Petr Programmer 80.000 23 2013-08-12
3 Ivanov Sergey Tester 40.000 tredive 2014-01-01
4 Rabinovich Moisha Direktør 200.000 35 2015-05-12
5 Kirienko Anastasia Kontorchef 40.000 25 2015-10-10
6 Vaska Kat 1000 3 2018-11-11

medarbejder tabel:

Denne tabel har følgende kolonner:

  • id INT
  • navn VARCHAR
  • erhverv VARCHA
  • løn INT
  • alder INT
  • join_date DATE

Og sådan ser opgavetabellen , som indeholder opgaver for medarbejdere, ud:

id emploee_id navn deadline
1 1 Ret en fejl på frontend 2022-06-01
2 2 Ret en fejl på backend 2022-06-15
3 5 Køb kaffe 2022-07-01
4 5 Køb kaffe 2022-08-01
5 5 Køb kaffe 2022-09-01
6 (NUL) Ryd op på kontoret (NUL)
7 4 Nyd livet (NUL)
8 6 Nyd livet (NUL)

Denne tabel har kun 4 kolonner:

  • id er det unikke nummer på opgaven (og rækker i tabellen).
  • medarbejder_id - ID for medarbejderen fra medarbejdertabellen, som opgaven er tildelt.
  • navn - navnet og beskrivelsen af ​​opgaven.
  • deadline - det tidspunkt, hvor opgaven skal være afsluttet.

En enkelt post i medarbejdertabellen kan refereres af mange rækker i opgavetabellen. Sådan en relation på tabelniveau kaldes en-til -mange.

Relation til Java-klasseniveau

Og vores klasser, medarbejderklassen :

@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;
}

Og EmployeeTask- klassen i sin oprindelige form:

@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 annotation

Vi kan arrangere kommunikation mellem enhedsklasser på en anden måde.

Kan du huske @ElementCollection- annotationen , som vi brugte til at oprette en samling af underordnede objekter i den overordnede klasse? Noget lignende kan gøres med @OneToMany- annotationen . Kun denne gang vil medarbejderklassen blive ændret :

@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>();
}

Ved at bruge @OneToMany -annotationen angav vi, at objektetmedarbejderkan gemme mange EmployeeTask- objekter . Ved hjælp af @JoinColumn- annotationen har vi også angivet, i hvilken kolonne i opgavetabellen objekt-id'et er gemtmedarbejder.

EmployeeTask- klassen indeholder dog normalt ikke et felt, der refererer til kolonnen medarbejder_id. Eksempel:

@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String description;

   @Column(name="deadline")
   public Date deadline;
}

Medarbejder_id-feltet betragtes som et servicefelt, og dets værdi styres af Hibernate.

Anmod om eksempler

Hvis du vil tilføje en opgave til en arbejder, skal du skrive kode som denne:

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();

Først opretter vi to EmployeeTask- objekter , gemmer dem i databasen og kalder flush()- metoden , så INSERT-operationen udføres, og objekterne har ID'er.

Så finder vi direktøren i databasen, tager opgavefeltet fra ham og tilføjer to opgaver til ham. Så gemmer vi direktøren i databasen. Derefter vises værdien 4 i databasen for nye opgaver i kolonnen medarbejder_id - direktørens id i medarbejdertabellen.

Vigtig! Tabellerne i databasen er de samme for @ManyToOne- og @OneToMany- annoteringerne . Men Java-klasserne for disse tabeller er forskellige.