SPRING DATA JPA – ASSOCIATIONS
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
PLAN DU COURS
– Associations entre entités :
• One to One (1:1) - Unidirectionnelle / Bidirectionnelle
• One to Many (1:N) - Unidirectionnelle / Bidirectionnelle
• Many to One (N:1) - Unidirectionnelle / Bidirectionnelle
• Many to Many (N:M) - Unidirectionnelle / Bidirectionnelle
– TP : Mise en œuvre des différentes associations
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Diagramme de Classes (sans cardinalité)
Entreprise Equipe
ProjetDetail Projet
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Trouvez et Expliquez les Associations
• One To One entre Projet et ProjetDetail (Clé étrangère
projet_detail_pd_id).
• Le projet a un seul détail (une seule ligne dans la table ProjetDetail).
Le détail d’un projet est lié à un seul Projet.
• Many To Many : Equipe et Projet (Table d’association
Equipe_PROJETS).
• L’Equipe a plusieurs Projets (Projet1, Projet2, …). Un même projet peut
être lié à plusieurs équipes (équipe Développement web, équipe
DevOps…).
• One To Many : L’Entreprise peut avoir plusieurs Equipes
(Développement web, Développement mobile, DevOps, Test…). Une
équipe n’est liée qu’à une seule entreprise.
• Place à la pratique, pour créer vous-même toutes ces associations :
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Diagramme de Classes (avec cardinalité)
1 *
Entreprise Equipe
*
1 1
ProjetDetail Projet
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Projet Spring Boot : gestion-projet
• Comme nous l’avons fait en Séance 2 (Cours Spring Boot), créer un
projet Spring Boot gestion-projet, sur lequel nous allons tester toutes les
associations possibles.
• Garder de côté le projet tp-foyer, nous ferons à la fin de la séance
(homework) toutes les associations relatives au diagramme de classe
du TP Foyer.
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
[Link]
@Entity
…
public class Projet {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String sujet;
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
[Link]
@Entity
….
public class Projet_Detail {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String description;
private String technologie;
private Long cout_provisoire;
private Date dateDebut;
}
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
[Link]
@Entity
….
public class Entreprise {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String nom;
private String adresse;
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
[Link]
@Entity
…
public class Equipe {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String nom;
private String specialite;
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
One To One Unidirectionnelle
• One To One : Le Projet a un seul détail (une seule ligne dans la table
ProjetDetail). Le détail d’un projet est lié à un seul Projet.
• Unidirectionnelle : Le Projet connait le détail (contient un attribut de
type Projet_Detail), alors que le détail n’a aucune information sur le
Projet auquel il est associé.
1 1
Projet ProjetDetail
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
One To One Unidirectionnelle
@Entity
public class Projet {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String sujet;
@OneToOne
private Projet_Detail projetDetail;
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
One To One Unidirectionnelle
@Entity
public class Projet_Detail {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String description;
private String technologie;
private Long cout_provisoire;
private Date dateDebut;
}
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
One To One Unidirectionnelle
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
One To One Bidirectionnelle
• One To One : Le Projet a un seul détail (une seule ligne dans la table
ProjetDetail). Le détail d’un projet est lié à un seul Projet.
• Bidirectionnelle : l’Entité «Projet» contient un attribut de type «Projet_Detail»
et l’Entité «Projet_Detail» contient un attribut de type «Projet».
• C’est l’attribut «mappedBy» qui crée le caractère bidirectionnel de la
relation et qui permet de définir les deux bouts de l’association «Parent /
Child».
• Au niveau des Entités Java, c’est le fils qui contient l’attribut «mappedBy».
• En base de données, c’est le Parent qui contiendra la Clé étrangère qui
pointera vers le Child.
1 1
Projet ProjetDetail
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
One To One Bidirectionnelle
@Entity
public class Projet {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String sujet;
@OneToOne
private Projet_Detail projetDetail;
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
One To One Bidirectionnelle
@Entity
public class Projet_Detail {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String description;
private String technologie;
private Long cout_provisoire;
private Date dateDebut;
@OneToOne(mappedBy="projetDetail")
private Projet projet;
}
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
One To One Bidirectionnelle
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
One To Many Unidirectionnelle
• One To Many : Une entreprise peut avoir plusieurs équipes
(Développement web, Développement mobile, DevOps, Test…). Une
équipe n’est liée qu’à une seule entreprise.
• Unidirectionnelle Entreprise 🡪 Equipe : L’entreprise connaît les
équipes, alors que l’équipe n’a aucune information sur l’entreprise à
laquelle elle appartient.
1 *
Entreprise Equipe
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
One To Many Unidirectionnelle
@Entity
public class Entreprise {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String nom;
private String adresse;
@OneToMany(cascade = [Link])
private Set<Equipe> Equipes;
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
One To Many Unidirectionnelle
@Entity
public class Equipe {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String nom;
private String specialite;
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
One To Many Unidirectionnelle
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
One To Many Bidirectionnelle
• One To Many Bidirectionnelle = Many To One Bidirectionnelle :
• Voir Slide Many To One Bidirectionnelle dans la suite du cours
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To One Unidirectionnelle
• Many To One : Une entreprise peut avoir plusieurs équipes. Chaque
équipe est liée à une unique entreprise.
• Unidirectionnelle : Chaque équipe a l’information concernant
l’entreprise (attribut Entreprise dans l’Entité Equipe, Clé étrangère
dans la table Equipe), alors que l’Entreprise n’a aucune information
sur ses «Equipes».
* 1
Equipe Entreprise
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To One Unidirectionnelle
@Entity
public class Equipe {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String nom;
private String specialite;
@ManyToOne(cascade = [Link])
Entreprise entreprise;
}
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To One Unidirectionnelle
@Entity
public class Entreprise {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String nom;
private String adresse;
}
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To One Unidirectionnelle
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To One Bidirectionnelle
• Many To One : Une entreprise peut avoir plusieurs Equipes. Une Equipe
est liée à une seule Entreprise.
• Bidirectionnelle : L’entreprise connait ses Equipes. Chaque Equipe
connaît elle aussi l’Entreprise associée.
* 1
Equipe Entreprise
• L’attribut mappedBy est défini pour l'annotation @OneToMany
(toujours au niveau de l’entité qui a la cardinalité la plus faible).
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To One Bidirectionnelle
@Entity
public class Equipe {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String nom;
private String specialite;
@ManyToOne
Entreprise entreprise;
}
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To One Bidirectionnelle
@Entity
public class Entreprise {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String nom;
private String adresse;
@OneToMany(cascade = [Link], mappedBy="entreprise")
private Set<Equipe> Equipes;
}
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To One Bidirectionnelle
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To Many Unidirectionnelle
• Many To Many : Une équipe peut travailler sur plusieurs Projets
(Projet1, Projet2, …). Un même projet peut être lié à plusieurs
équipes (équipe Développement web, équipe DevOps…).
• Unidirectionnelle : L’équipe a plusieurs Projets et les connaît.
Mais, le Projet n’a aucune information sur «les équipes»
auxquelles il est associé.
* *
Equipe Projet
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To Many Unidirectionnelle
@Entity
public class Equipe {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String nom;
private String specialite;
@ManyToMany(cascade = [Link])
private Set<Projet> projets;
}
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To Many Unidirectionnelle
@Entity
public class Projet {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String sujet;
}
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To Many Unidirectionnelle
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To Many Bidirectionnelle
• Many To Many : Une équipe peut travailler sur plusieurs Projets
(Projet1, Projet2, …). Un même projet peut être lié à plusieurs
équipes (équipe Développement web, équipe DevOps…).
• Bidirectionnelle : L’équipe a plusieurs Projets et les connaît.
Chaque Projet est associé à plusieurs Equipes, et peut accéder
aux attributs de la table équipe.
* *
Equipe Projet
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To Many Bidirectionnelle
@Entity
public class Equipe {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String nom;
private String specialite;
@ManyToMany(cascade = [Link])
private Set<Projet> projets;
}
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To Many Bidirectionnelle
@Entity
public class Projet {
@Id
@GeneratedValue(strategy = [Link])
private Long id;
private String sujet;
@ManyToMany(mappedBy="projets", cascade = [Link])
private Set<Equipe> equipes;
}
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Many To Many Bidirectionnelle
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
CASCADE
@ManyToMany(cascade = {[Link], [Link]},
fetch=[Link])
private Set<Projet> projets;
• [Link] : Cascade toutes les opérations (PERSSIT, REMOVE, …) du
parent vers le child.
• [Link] : Cascade l’opération REMOVE (Suppression) du parent
vers le child. Ci-dessus, quand on supprime une équipe, alors les Projets de cette
équipe seront supprimés (pour éviter d’avoir des projets orphelins : sans équipe).
• [Link] : Cascade l’opération PERSSIT (Ajout) du parent vers le
child. Ci-dessus, quand on ajoute une équipe, alors, si l’objet équipe ajouté
contient des projets, l’équipe et les projets seront ajoutés.
• Par défaut (si on ne met pas CascadeType), aucune opération n’est cascadée.
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
FETCH
@ManyToMany(fetch=[Link])
private Set<Projet> projets;
• [Link] (avec impatience): Quand on récupère une équipe de la base
de données, tous les projets liés à cette équipe seront récupérés eux aussi.
• [Link] (avec paresse): Quand on récupère une équipe de la base de
données, aucun projet lié à cette équipe ne sera récupéré, jusqu’à ce que nous
faisons un appel explicite dans le code : [Link] par exemple (equipe
étant une instance de Equipe).
• Par défaut (Si one ne met pas FetchType), les valeurs par défaut sont :
– OneToMany et ManyToMany : LAZY
– ManyToOne et OneToOne : EAGER
(Quand c'est Many à la fin, c'est LAZY car on risque de récupérer beaucoup d'éléments "Many"
c’est dangereux. Quand c'est One à la fin c'est EAGER car le volume des données associés n’est
pas très important.
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Travail à faire
TP étude de cas tp-foyer
Dans l’étude de cas TP FOYER et après avoir créer les entités lors de la dernière
séance :
• Supprimer la base de données.
• Créer les associations entre les différentes entités.
• Générer la base de données de nouveau et vérifier que le nombre de tables
crées est correct.
(voir diagramme page suivante)
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations
Diagrammes de Classes
© 2023-2024 – ESPRIT – Module ASI II (Spring) – Spring Data JPA – Associations