Relazione a livello di tabella
Diamo un'occhiata di nuovo alle nostre due tabelle:
id | nome | occupazione | stipendio | età | data di iscrizione |
---|---|---|---|---|---|
1 | Ivanov Ivan | Programmatore | 100000 | 25 | 2012-06-30 |
2 | Petrov Petr | Programmatore | 80000 | 23 | 2013-08-12 |
3 | Sergej Ivanov | Tester | 40000 | trenta | 2014-01-01 |
4 | Rabinovich Moisha | Direttore | 200000 | 35 | 2015-05-12 |
5 | Kirienko Anastasia | Capo ufficio | 40000 | 25 | 2015-10-10 |
6 | Vasca | Gatto | 1000 | 3 | 2018-11-11 |
tabella dei dipendenti:
Questa tabella ha le seguenti colonne:
- id INT
- nome VARCHAR
- occupazione VARCHA
- stipendio INT
- età INT
- join_date DATE
Ed ecco come appare la tabella delle attività , che contiene le attività per i dipendenti:
id | impiegato_id | nome | scadenza |
---|---|---|---|
1 | 1 | Risolto un bug sul frontend | 2022-06-01 |
2 | 2 | Risolto un bug sul backend | 2022-06-15 |
3 | 5 | Compra il caffè | 2022-07-01 |
4 | 5 | Compra il caffè | 2022-08-01 |
5 | 5 | Compra il caffè | 2022-09-01 |
6 | (NULLO) | Pulisci l'ufficio | (NULLO) |
7 | 4 | Goditi la vita | (NULLO) |
8 | 6 | Goditi la vita | (NULLO) |
Questa tabella ha solo 4 colonne:
- id è il numero univoco dell'attività (e le righe nella tabella).
- employee_id - ID del dipendente dalla tabella dei dipendenti a cui è assegnata l'attività.
- name - il nome e la descrizione dell'attività.
- scadenza - il tempo entro il quale l'attività deve essere completata.
Una singola voce nella tabella dei dipendenti può essere referenziata da molte righe nella tabella delle attività. Tale relazione a livello di tabella è chiamata uno-a -molti.
Relazione con il livello di classe Java
E le nostre classi, la classe Employee :
@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;
}
E la classe EmployeeTask nella sua forma originale:
@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 annotazione
Possiamo organizzare la comunicazione tra le classi Entity in un modo diverso.
Ricordi l' annotazione @ElementCollection che abbiamo usato per creare una raccolta di oggetti figlio nella classe genitore? Qualcosa di simile può essere fatto con l' annotazione @OneToMany . Solo che questa volta la classe Employee verrà modificata :
@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>();
}
Usando l' annotazione @OneToMany , abbiamo indicato che l'oggettodipendentepuò memorizzare molti oggetti EmployeeTask . Inoltre, utilizzando l' annotazione @JoinColumn , abbiamo indicato in quale colonna della tabella delle attività è memorizzato l'id dell'oggettodipendente.
Tuttavia, la classe EmployeeTask in genere non contiene un campo che fa riferimento alla colonna employee_id. Esempio:
@Entity
@Table(name="task")
class EmployeeTask {
@Column(name="id")
public Integer id;
@Column(name="name")
public String description;
@Column(name="deadline")
public Date deadline;
}
Il campo employee_id è considerato un campo di servizio e il suo valore è controllato da Hibernate.
Richiedi esempi
Se vuoi aggiungere un'attività a un lavoratore, devi scrivere un codice come questo:
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();
Innanzitutto, creiamo due oggetti EmployeeTask , li salviamo nel database e chiamiamo il metodo flush() in modo che venga eseguita l'operazione INSERT e gli oggetti abbiano ID.
Quindi troviamo il direttore nel database, gli prendiamo il campo delle attività e gli aggiungiamo due attività. Quindi salviamo il direttore nel database. Dopodiché, il valore 4 apparirà nel database per le nuove attività nella colonna employee_id - l'id del direttore nella tabella dei dipendenti.
Importante! Le tabelle nel database sono le stesse per le annotazioni @ManyToOne e @OneToMany . Ma le classi Java per queste tabelle sono diverse.
GO TO FULL VERSION