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