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.