Relation pÄ tabellnivÄ
LÄt oss titta pÄ vÄra tvÄ tabeller igen:
id | namn | ockupation | lön | Älder | join_date |
---|---|---|---|---|---|
1 | Ivanov Ivan | Programmerare | 100 000 | 25 | 2012-06-30 |
2 | Petrov Petr | Programmerare | 80 000 | 23 | 2013-08-12 |
3 | Ivanov Sergey | Testare | 40 000 | trettio | 2014-01-01 |
4 | Rabinovich Moisha | Direktör | 200 000 | 35 | 2015-05-12 |
5 | Kirienko Anastasia | Kontors chef | 40 000 | 25 | 2015-10-10 |
6 | Vaska | Katt | 1000 | 3 | 2018-11-11 |
anstÀlld tabell:
Den hÀr tabellen har följande kolumner:
- id INT
- namn VARCHAR
- yrke VARCHA
- lön INT
- Ă„lder INT
- join_date DATE
Och sÄ hÀr ser uppgiftstabellen ut, som innehÄller uppgifter för anstÀllda:
id | emploee_id | namn | deadline |
---|---|---|---|
1 | 1 | Fixa en bugg pÄ frontend | 2022-06-01 |
2 | 2 | Fixa en bugg pÄ backend | 2022-06-15 |
3 | 5 | Köp kaffe | 2022-07-01 |
4 | 5 | Köp kaffe | 2022-08-01 |
5 | 5 | Köp kaffe | 2022-09-01 |
6 | (NULL) | StÀda kontoret | (NULL) |
7 | 4 | Njut av livet | (NULL) |
8 | 6 | Njut av livet | (NULL) |
Den hÀr tabellen har bara 4 kolumner:
- id Àr det unika numret för uppgiften (och rader i tabellen).
- anstÀlld_id - ID för den anstÀllde frÄn den anstÀllde tabellen som uppgiften Àr tilldelad.
- namn - namnet och beskrivningen av uppgiften.
- deadline - den tidpunkt dÄ uppgiften ska vara klar.
En enskild post i anstÀlldstabellen kan refereras av mÄnga rader i uppgiftstabellen. En sÄdan relation pÄ tabellnivÄ kallas en-till- mÄnga.
Relation till Java-klassnivÄn
Och vÄra klasser, klassen AnstÀlld :
@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;
}
Och EmployeeTask -klassen i sin ursprungliga 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-anteckning
Vi kan ordna kommunikation mellan Entity-klasser pÄ ett annat sÀtt.
Kommer du ihÄg @ElementCollection- anteckningen som vi anvÀnde för att skapa en samling av underordnade objekt i den överordnade klassen? NÄgot liknande kan göras med @OneToMany -kommentaren . Endast den hÀr gÄngen kommer klassen AnstÀlld Àndras :
@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>();
}
Med @OneToMany -anteckningen angav vi att objektetanstÀlldkan lagra mÄnga EmployeeTask- objekt . Med hjÀlp av @JoinColumn -kommentaren angav vi ocksÄ i vilken kolumn i uppgiftstabellen objekt-id:t Àr lagratanstÀlld.
EmployeeTask -klassen innehÄller dock vanligtvis inte ett fÀlt som hÀnvisar till kolumnen werknemer_id. Exempel:
@Entity
@Table(name="task")
class EmployeeTask {
@Column(name="id")
public Integer id;
@Column(name="name")
public String description;
@Column(name="deadline")
public Date deadline;
}
FÀltet anstÀlld_id anses vara ett tjÀnstefÀlt och dess vÀrde styrs av Hibernate.
BegÀr exempel
Om du vill lÀgga till nÄgon uppgift till nÄgon arbetare, mÄste du skriva kod sÄ hÀr:
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 skapar vi tvÄ EmployeeTask- objekt , sparar dem i databasen och anropar metoden flush() sÄ att INSERT-operationen utförs och objekten har ID:n.
Sedan hittar vi regissören i databasen, tar uppgiftsfÀltet frÄn honom och lÀgger till tvÄ uppgifter till honom. Sedan sparar vi regissören till databasen. DÀrefter kommer vÀrdet 4 att dyka upp i databasen för nya uppgifter i kolumnen för anstÀllda_id - regissörens id i tabellen för anstÀllda.
Viktig! Tabellerna i databasen Àr desamma för @ManyToOne- och @OneToMany -annoteringarna . Men Java-klasserna för dessa tabeller Àr olika.
GO TO FULL VERSION