Relation au niveau de la table
Reprenons nos deux tableaux :
identifiant | nom | profession | salaire | âge | join_date |
---|---|---|---|---|---|
1 | Ivanov Ivan | Programmeur | 100000 | 25 | 2012-06-30 |
2 | Petrov Petr | Programmeur | 80000 | 23 | 2013-08-12 |
3 | Ivanov Sergueï | Testeur | 40000 | trente | 2014-01-01 |
4 | Rabinovitch Moisha | Directeur | 200000 | 35 | 2015-05-12 |
5 | Kirienko Anastasia | Responsable administratif | 40000 | 25 | 2015-10-10 |
6 | Vaska | Chat | 1000 | 3 | 2018-11-11 |
tableau des employés :
Ce tableau comporte les colonnes suivantes :
- identifiant INT
- nom VARCHAR
- Profession VARCHA
- salaire INT
- âge INT
- join_date DATE
Et voici à quoi ressemble la table des tâches , qui contient les tâches des employés :
identifiant | id_employé | nom | date limite |
---|---|---|---|
1 | 1 | Correction d'un bug sur le frontend | 2022-06-01 |
2 | 2 | Correction d'un bug sur le backend | 2022-06-15 |
3 | 5 | Acheter du café | 2022-07-01 |
4 | 5 | Acheter du café | 2022-08-01 |
5 | 5 | Acheter du café | 2022-09-01 |
6 | (NUL) | Nettoyer le bureau | (NUL) |
7 | 4 | Profite de la vie | (NUL) |
8 | 6 | Profite de la vie | (NUL) |
Ce tableau n'a que 4 colonnes :
- id est le numéro unique de la tâche (et des lignes du tableau).
- employee_id - ID de l'employé de la table des employés auquel la tâche est affectée.
- nom - le nom et la description de la tâche.
- délai - l'heure à laquelle la tâche doit être terminée.
Une seule entrée dans la table des employés peut être référencée par plusieurs lignes dans la table des tâches. Une telle relation au niveau de la table est appelée un à plusieurs.
Relation avec le niveau de classe Java
Et nos classes, 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;
}
Et la classe EmployeeTask dans sa forme 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;
}
Annotation @OneToMany
Nous pouvons organiser la communication entre les classes Entity d'une manière différente.
Vous souvenez-vous de l'annotation @ElementCollection que nous avons utilisée pour créer une collection d'objets enfants dans la classe parent ? Quelque chose de similaire peut être fait avec l' annotation @OneToMany . Seulement cette fois, la classe Employé sera modifiée :
@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>();
}
En utilisant l' annotation @OneToMany , nous avons indiqué que l'objetemployépeut stocker de nombreux objets EmployeeTask . De plus, en utilisant l' annotation @JoinColumn , nous avons indiqué dans quelle colonne de la table des tâches l'identifiant de l'objet est stockéemployé.
Cependant, la classe EmployeeTask ne contient généralement pas de champ faisant référence à la colonne employee_id. Exemple:
@Entity
@Table(name="task")
class EmployeeTask {
@Column(name="id")
public Integer id;
@Column(name="name")
public String description;
@Column(name="deadline")
public Date deadline;
}
Le champ employee_id est considéré comme un champ de service et sa valeur est contrôlée par Hibernate.
Demander des exemples
Si vous souhaitez ajouter une tâche à un travailleur, vous devez écrire un code comme celui-ci :
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();
Tout d'abord, nous créons deux objets EmployeeTask , les enregistrons dans la base de données et appelons la méthode flush() afin que l'opération INSERT soit effectuée et que les objets aient des ID.
Ensuite, nous trouvons le directeur dans la base de données, lui prenons le champ des tâches et lui ajoutons deux tâches. Ensuite, nous enregistrons le directeur dans la base de données. Après cela, la valeur 4 apparaîtra dans la base de données pour les nouvelles tâches dans la colonne employee_id - l'identifiant du directeur dans la table des employés.
Important! Les tables de la base de données sont les mêmes pour les annotations @ManyToOne et @OneToMany . Mais les classes Java pour ces tables sont différentes.
GO TO FULL VERSION