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.