Relatie op tafelniveau

Laten we nog eens naar onze twee tabellen kijken:

ID kaart naam bezigheid salaris leeftijd join_date
1 Ivanov Ivan Programmeur 100000 25 2012-06-30
2 Petrov Petr Programmeur 80000 23 2013-08-12
3 Ivanov Sergej Tester 40000 dertig 01-01-2014
4 Rabinovich Moisha Regisseur 200000 35 2015-05-12
5 Kirienko Anastasia Officemanager 40000 25 2015-10-10
6 Vaska Kat 1000 3 2018-11-11

werknemers tafel:

Deze tabel heeft de volgende kolommen:

  • id INT
  • naam VARCHAR
  • bezetting VARCHA
  • salaris INT
  • leeftijd INT
  • join_date DATUM

En zo ziet de takentabel , die taken voor medewerkers bevat, er uit:

ID kaart medewerker_id naam deadline
1 1 Los een bug op de frontend op 01-06-2022
2 2 Los een bug op de backend op 2022-06-15
3 5 Koop koffie 01-07-2022
4 5 Koop koffie 01-08-2022
5 5 Koop koffie 01-09-2022
6 (NUL) Ruim het kantoor op (NUL)
7 4 Geniet van het leven (NUL)
8 6 Geniet van het leven (NUL)

Deze tabel heeft slechts 4 kolommen:

  • id is het unieke nummer van de taak (en rijen in de tabel).
  • employee_id - ID van de werknemer uit de werknemerstabel waaraan de taak is toegewezen.
  • naam - de naam en beschrijving van de taak.
  • deadline - de tijd waarop de taak moet zijn voltooid.

Er kan naar een enkel item in de werknemerstabel worden verwezen door vele rijen in de taaktabel. Een dergelijke relatie op tabelniveau wordt een-op- veel genoemd.

Relatie met het Java-klassenniveau

En onze klassen, de Werknemersklasse :

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

En de klasse EmployeeTask in zijn oorspronkelijke vorm:

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

We kunnen de communicatie tussen Entity-klassen op een andere manier regelen.

Weet je nog de @ElementCollection- annotatie die we gebruikten om een ​​verzameling onderliggende objecten in de bovenliggende klasse te maken? Iets soortgelijks kan worden gedaan met de annotatie @OneToMany . Alleen deze keer wordt de klasse Werknemer gewijzigd :

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

Met de annotatie @OneToMany hebben we aangegeven dat het objectmedewerkerkan veel EmployeeTask- objecten opslaan . Ook hebben we met behulp van de @JoinColumn annotatie aangegeven in welke kolom van de taaktabel de object-ID is opgeslagenmedewerker.

De klasse EmployeeTask bevat echter meestal geen veld dat verwijst naar de kolom employee_id. Voorbeeld:

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

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

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

Het veld employee_id wordt beschouwd als een serviceveld en de waarde ervan wordt beheerd door Hibernate.

Vraag voorbeelden aan

Als u een taak aan een werknemer wilt toevoegen, moet u de volgende code schrijven:

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

Eerst maken we twee EmployeeTask- objecten , slaan ze op in de database en roepen de methode flush() aan zodat de INSERT-bewerking wordt uitgevoerd en de objecten ID's hebben.

Vervolgens vinden we de directeur in de database, nemen het takenveld van hem over en voegen twee taken aan hem toe. Vervolgens slaan we de regisseur op in de database. Daarna verschijnt de waarde 4 in de database voor nieuwe taken in de kolom employee_id - de id van de directeur in de werknemerstabel.

Belangrijk! De tabellen in de database zijn dezelfde voor de annotaties @ManyToOne en @OneToMany . Maar de Java-klassen voor deze tabellen zijn anders.