Forhold på tabellnivå
La oss se på de to tabellene våre igjen:
id | Navn | okkupasjon | lønn | alder | join_date |
---|---|---|---|---|---|
1 | Ivanov Ivan | Programmerer | 100 000 | 25 | 2012-06-30 |
2 | Petrov Petr | Programmerer | 80 000 | 23 | 2013-08-12 |
3 | Ivanov Sergey | Tester | 40 000 | tretti | 2014-01-01 |
4 | Rabinovich Moisha | Regissør | 200 000 | 35 | 2015-05-12 |
5 | Kirienko Anastasia | Kontorsjef | 40 000 | 25 | 2015-10-10 |
6 | Vaska | Katt | 1000 | 3 | 2018-11-11 |
ansatttabell:
Denne tabellen har følgende kolonner:
- ID INT
- navn VARCHAR
- yrke VARCHA
- lønn INT
- alder INT
- join_date DATE
Og slik ser oppgavetabellen , som inneholder oppgaver for ansatte, ut:
id | emploee_id | Navn | frist |
---|---|---|---|
1 | 1 | Rett opp en feil på frontend | 2022-06-01 |
2 | 2 | Rett opp en feil på backend | 2022-06-15 |
3 | 5 | Kjøp kaffe | 2022-07-01 |
4 | 5 | Kjøp kaffe | 2022-08-01 |
5 | 5 | Kjøp kaffe | 2022-09-01 |
6 | (NULL) | Rydd opp på kontoret | (NULL) |
7 | 4 | Nyt livet | (NULL) |
8 | 6 | Nyt livet | (NULL) |
Denne tabellen har bare 4 kolonner:
- id er det unike nummeret til oppgaven (og rader i tabellen).
- ansatt_id - ID for den ansatte fra ansatttabellen som oppgaven er tilordnet.
- navn - navnet og beskrivelsen av oppgaven.
- deadline - tidspunktet for når oppgaven skal være fullført.
En enkelt oppføring i ansatttabellen kan refereres av mange rader i oppgavetabellen. En slik relasjon på tabellnivå kalles en-til -mange.
Forholdet til Java-klassenivået
Og våre klasser, Ansatt- klassen :
@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 opprinnelige 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-kommentar
Vi kan arrangere kommunikasjon mellom Entity-klasser på en annen måte.
Husker du @ElementCollection- kommentaren som vi brukte til å lage en samling av underordnede objekter i den overordnede klassen? Noe lignende kan gjøres med @OneToMany -kommentaren . Bare denne gangen vil Employee- klassen bli endret :
@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 å bruke @OneToMany -kommentaren indikerte vi at objektetansattkan lagre mange EmployeeTask- objekter . Ved å bruke @JoinColumn- kommentaren indikerte vi også i hvilken kolonne i oppgavetabellen objekt-ID-en er lagretansatt.
EmployeeTask -klassen inneholder imidlertid vanligvis ikke et felt som refererer til kolonnen ansatt_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;
}
Medarbeider-id-feltet regnes som et tjenestefelt, og verdien kontrolleres av Hibernate.
Be om eksempler
Hvis du vil legge til en oppgave til en arbeider, må du skrive kode slik:
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 lager vi to EmployeeTask- objekter , lagrer dem i databasen og kaller opp flush()- metoden slik at INSERT-operasjonen utføres og objektene har IDer.
Så finner vi direktøren i databasen, tar oppgavefeltet fra ham og legger til to oppgaver til ham. Deretter lagrer vi direktøren i databasen. Etter det vil verdien 4 vises i databasen for nye oppgaver i kolonnen ansatt_id - id-en til direktøren i ansatttabellen.
Viktig! Tabellene i databasen er de samme for @ManyToOne- og @OneToMany -kommentarene . Men Java-klassene for disse tabellene er forskjellige.
GO TO FULL VERSION