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.
GO TO FULL VERSION