Relacja na poziomie tabeli
Spójrzmy ponownie na nasze dwie tabele:
ID | nazwa | zawód | wynagrodzenie | wiek | data_dołączenia |
---|---|---|---|---|---|
1 | Iwanow Iwan | Programista | 100000 | 25 | 2012-06-30 |
2 | Pietrow Pietr | Programista | 80000 | 23 | 2013-08-12 |
3 | Iwanow Siergiej | Próbnik | 40000 | trzydzieści | 2014-01-01 |
4 | Rabinowicz Mojsza | Dyrektor | 200000 | 35 | 2015-05-12 |
5 | Kirienko Anastazja | Kierownik biura | 40000 | 25 | 2015-10-10 |
6 | Vaska | Kot | 1000 | 3 | 2018-11-11 |
stół pracowniczy:
Ta tabela ma następujące kolumny:
- identyfikator INT
- imię VARCHAR
- zawód WARCHA
- wynagrodzenie INT
- wiek INT
- data_dołączenia DATA
A tak wygląda tabela zadań , która zawiera zadania dla pracowników:
ID | identyfikator_pracownika | nazwa | termin ostateczny |
---|---|---|---|
1 | 1 | Napraw błąd w interfejsie użytkownika | 2022-06-01 |
2 | 2 | Napraw błąd w backendzie | 2022-06-15 |
3 | 5 | Kup kawę | 2022-07-01 |
4 | 5 | Kup kawę | 2022-08-01 |
5 | 5 | Kup kawę | 2022-09-01 |
6 | (ZERO) | Posprzątaj biuro | (ZERO) |
7 | 4 | Ciesz się życiem | (ZERO) |
8 | 6 | Ciesz się życiem | (ZERO) |
Ta tabela ma tylko 4 kolumny:
- id to unikalny numer zadania (i wierszy w tabeli).
- id_pracownika - identyfikator pracownika z tabeli pracowników, do którego jest przypisane zadanie.
- name - nazwa i opis zadania.
- termin – czas, w jakim zadanie musi zostać wykonane.
Do pojedynczego wpisu w tabeli pracowników może odwoływać się wiele wierszy w tabeli zadań. Taka relacja na poziomie tabeli nazywana jest jeden-do -wielu.
Związek z poziomem klasy Java
A nasze klasy, klasa Pracownik :
@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;
}
I klasa EmployeeTask w oryginalnej postaci:
@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;
}
Adnotacja @OneToMany
Komunikację pomiędzy klasami Entity możemy zorganizować w inny sposób.
Pamiętasz adnotację @ElementCollection , której użyliśmy do stworzenia kolekcji obiektów podrzędnych w klasie nadrzędnej? Coś podobnego można zrobić za pomocą adnotacji @OneToMany . Tylko tym razem klasa Pracownik zostanie zmieniona :
@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>();
}
Za pomocą adnotacji @OneToMany wskazaliśmy, że obiektpracownikmoże przechowywać wiele obiektów EmployeeTask . Ponadto za pomocą adnotacji @JoinColumn wskazaliśmy w której kolumnie tabeli zadań przechowywany jest identyfikator obiektupracownik.
Jednak klasa EmployeeTask zazwyczaj nie zawiera pola odnoszącego się do kolumny id_pracownika. Przykład:
@Entity
@Table(name="task")
class EmployeeTask {
@Column(name="id")
public Integer id;
@Column(name="name")
public String description;
@Column(name="deadline")
public Date deadline;
}
Pole id_pracownika jest uważane za pole usługi, a jego wartość jest kontrolowana przez Hibernate.
Poproś o przykłady
Jeśli chcesz dodać jakieś zadanie do jakiegoś pracownika, musisz napisać taki kod:
EmployeeTask task1 = new EmployeeTask();
task1.description = „Zrób coś ważnego”;
session.persist(task1);
EmployeeTask task2 = new EmployeeTask();
task2.description = "Nic do roboty";
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();
Najpierw tworzymy dwa obiekty EmployeeTask , zapisujemy je w bazie danych i wywołujemy metodę flush() tak, aby została wykonana operacja INSERT i obiekty miały identyfikatory.
Następnie znajdujemy dyrektora w bazie danych, odbieramy od niego pole zadań i dodajemy do niego dwa zadania. Następnie zapisujemy dyrektora do bazy danych. Następnie w bazie danych dla nowych zadań w kolumnie id_pracownika pojawi się wartość 4 - id dyrektora w tabeli pracowników.
Ważny! Tabele w bazie danych są takie same dla adnotacji @ManyToOne i @OneToMany . Ale klasy Java dla tych tabel są różne.
GO TO FULL VERSION