0% ont trouvé ce document utile (0 vote)
196 vues39 pages

6 - Spring Data JPA - Associations

Le document décrit différents types d'associations entre entités dans Spring Data JPA, notamment les associations unidirectionnelles et bidirectionnelles de type one-to-one, one-to-many et many-to-one.

Transféré par

Chiheb NJ
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
196 vues39 pages

6 - Spring Data JPA - Associations

Le document décrit différents types d'associations entre entités dans Spring Data JPA, notamment les associations unidirectionnelles et bidirectionnelles de type one-to-one, one-to-many et many-to-one.

Transféré par

Chiheb NJ
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

SPRING DATA JPA – ASSOCIATIONS

UP ASI
Bureau E204

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI 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

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 2
Diagramme de Classes (sans cardinalité)

T_FORMATION T_FORMATION_DETAIL

T_TP_CORRECTION T_TP

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 3
MCD PHPMYADMIN

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 4
Trouvez et Expliquez les Associations

• One To One entre T_FORMATION et T_FORMATION_DETAIL (Clé étrangère


formationdetail_formation_id).
• La Formation a un ensemble de détails (une seule ligne dans la table
T_FORMATION_DETAIL). Le détail d’une formation est liée à une seule
Formation.

• Many To Many : T_FORMATION et T_TP (Table d’association


T_FORMATION_TP).
• La Formation a plusieurs TPs (TP1, TP2, …). Un même TP peut être lié à plusieurs
formations (Maven, Spring, JSF).

• One To Many : T_TP et T_TP_CORRECTION (Table d’association T_TP_TC).


• Le TP peut avoir plusieurs Corrections (Avec Maven / Sans Maven, Avec
Hibernate / Avec Spring Data JPA, …). Une Correction n’est liée qu’à un TP.
• Si l’association Many To One était utilisée entre T_TP et T_TP_CORRECTION, à
la place de One To Many, quel changement dans le diagramme ci-dessus?

• Place à la pratique, pour créer vous-même toutes ces associations :

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 5
One To One Unidirectionnelle

• One To One : La Formation a un ensemble de détails (une seule ligne


dans la table T_FORMATION_DETAIL). Le détail d’une formation est liée
à une seule Formation.

• Unidirectionnelle : La Formation connait le détail (contient un attribut


de type Formation_Detail), alors que le détail n’a aucune information
sur la Formation auquel il est associé.

1 1
T_FORMATION T_FORMATION_DETAIL

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 6
One To One Unidirectionnelle
@Entity
@Table(name = "T_FORMATION")
public class Formation implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue (strategy = [Link])
@Column(name="FORMATION_ID")
private Long id; // Identifiant formation (Clé primaire)

@Column(name="FORMATION_THEME")
private String theme; // Thème formation

@OneToOne
private FormationDetail formationDetail;

// Constructeurs, getters, setters

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 7
One To One Unidirectionnelle
@Entity
@Table(name="T_FORMATION_DETAIL")
public class FormationDetail implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue (strategy = [Link])
@Column(name="FD_ID")
private Long fdId;

@Column(name="FD_TABLE_MATIERE")
private String fdTableMatiere;

@Column(name="FD_SUPPORT_PDF")
private String fdSupportPDF;

// Constructeurs, getters, setters

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 8
One To One Unidirectionnelle

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 9
One To One Bidirectionnelle

• One To One : La Formation a un ensemble de détails (une seule ligne dans la


table T_FORMATION_DETAIL). Le détail d’une formation est liée à une seule
Formation.

• Bidirectionnelle : l’Entité «Formation» contient un attribut de type


«Formation_Detail» et l’Entité «Formation_Detail» contient un attribut de type
«Formation».
• 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
T_FORMATION T_FORMATION_DETAIL

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 10
One To One Bidirectionnelle
@Entity
@Table(name = "T_FORMATION")
public class Formation implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue (strategy = [Link])
@Column(name="FORMATION_ID")
private Long id; // Identifiant formation (Clé primaire)

@Column(name="FORMATION_THEME")
private String theme; // Thème formation

@OneToOne
private FormationDetail formationDetail;

// Constructeurs, getters, setters

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 11
One To One Bidirectionnelle
@Entity
@Table(name="T_FORMATION_DETAIL")
public class FormationDetail implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue (strategy = [Link])
@Column(name="FD_ID")
private Long fdId;

@Column(name="FD_TABLE_MATIERE")
private String fdTableMatiere;

@Column(name="FD_SUPPORT_PDF")
private String fdSupportPDF;

@OneToOne(mappedBy="formationDetail")
private Formation formation;

// Constructeurs, getters, setters

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 12
One To One Bidirectionnelle

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 13
One To Many Unidirectionnelle

• One To Many : Le TP peut avoir plusieurs Corrections (Avec Maven /


Sans Maven, Avec Hibernate / Avec Spring Data JPA, …). Une
Correction n’est liée qu’à un TP.

• Unidirectionnelle TP → Correction : Le TP connait les corrections, alors


que La Correction n’a aucune information sur le TP dont elle est la
Solution.

1 *
T_TP T_TP_CORRECTION

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 14
One To Many Unidirectionnelle
@Entity
@Table(name = "T_TP")
public class TravauxPratiques implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = [Link])
@Column(name="TP_ID")
Long tpId;

@Column(name="TP_SUJET")
String tpSujet;
@Column(name="TP_DUREE")
Long tpDuree;

@OneToMany(cascade = [Link])
private Set<TpCorrection> TpCorrections;

// Constructeurs, getters, setters


© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 15
One To Many Unidirectionnelle
@Entity
@Table(name="T_TP_CORRECTION")
public class TpCorrection implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue (strategy = [Link])
@Column(name="TC_ID")
private Long tcId;

@Column(name="TC_CORRECTION")
private String tcCorrection;

// Constructeurs, getters, setters

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 16
One To Many Unidirectionnelle

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 17
One To Many Bidirectionnelle

• One To Many Bidirectionnelle = Many To One Bidirectionnelle :

• Voir Slide Many To One Bidirectionnelle dans la suite du cours

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 18
Many To One Unidirectionnelle

• Many To One : un TP peut avoir plusieurs Corrections. Chaque


Correction est liée à un unique TP.

• Unidirectionnelle : Chaque Correction de TP a l’information


concernant le TP (attribut TravauxPratiques dans l’Entité TP_Correction,
Clé étrangère dans la table T_TP_CORRECTION), alors que le TP n’a
aucune information sur ses «Corrections».

* 1
T_TP_CORRECTION T_TP

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 19
Many To One Unidirectionnelle
@Entity
@Table(name="T_TP_CORRECTION")
public class TpCorrection implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue (strategy = [Link])
@Column(name="TC_ID")
private Long tcId;

@Column(name="TC_CORRECTION")
private String tcCorrection;

@ManyToOne(cascade = [Link])
TravauxPratiques travauxPratiques;

// Constructeurs, getters, setters

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 20
Many To One Unidirectionnelle
@Entity
@Table(name = "T_TP")
public class TravauxPratiques implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = [Link])
@Column(name="TP_ID")
Long tpId;

@Column(name="TP_SUJET")
String tpSujet;

@Column(name="TP_DUREE")
Long tpDuree;

// Constructeurs, getters, setters

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 21
Many To One Unidirectionnelle

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 22
Many To One Bidirectionnelle

• Many To One : Un TP peut avoir plusieurs Correction. Une Correction


est liée à un seul TP.
• Bidirectionnelle : Le TP connait ses Corrections. Chaque Correction
connait elle aussi le TP dont elle est la Solution.

* 1
T_TP_CORRECTION T_TP

• L’attribut mappedBy est défini pour l'annotation @OneToMany


(toujours au niveau de l’entité qui a la cardinalité la plus faible).

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 23
Many To One Bidirectionnelle
@Entity
@Table(name="T_TP_CORRECTION")
public class TpCorrection implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue (strategy = [Link])
@Column(name="TC_ID")
private Long tcId;

@Column(name="TC_CORRECTION")
private String tcCorrection;

@ManyToOne
TravauxPratiques travauxPratiques;

// Constructeurs, getters, setters

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 24
Many To One Bidirectionnelle
@Entity
@Table(name = "T_TP")
public class TravauxPratiques implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = [Link])
@Column(name="TP_ID")
Long tpId;

@Column(name="TP_SUJET")
String tpSujet;

@Column(name="TP_DUREE")
Long tpDuree;

@OneToMany(cascade = [Link], mappedBy="travauxPratiques")


private Set<TpCorrection> TpCorrections;

// Constructeurs, getters, setters

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 25
Many To One Bidirectionnelle

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 26
Many To Many Unidirectionnelle

• Many To Many : La Formation a plusieurs TPs (TP1, TP2, …). Un


même TP peut être lié à plusieurs formations (Maven, Spring,
JSF).
• Unidirectionnelle : La formation a plusieurs TPs et les connait.
Mais, le TP n’a aucune information sur «les Formations»
auxquelles il est associé.

* *
T_FORMATION T_TP

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 27
Many To Many Unidirectionnelle
@Entity
@Table(name = "T_FORMATION")
public class Formation implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue (strategy = [Link])
@Column(name="FORMATION_ID")
private Long id; // Identifiant formation (Clé primaire)

@Column(name="FORMATION_THEME")
private String theme; // Thème formation

@OneToOne(cascade = [Link])
@JoinColumn(name="FK_FD_ID")
private FormationDetail formationDetail;

@ManyToMany(cascade = [Link])
private Set<TravauxPratiques> formationTps;

// Constructeurs, getters, setters

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 28
Many To Many Unidirectionnelle
@Entity
@Table(name = "T_TP")
public class TravauxPratiques implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = [Link])
@Column(name="TP_ID")
Long tpId;

@Column(name="TP_SUJET")
String tpSujet;

@Column(name="TP_DUREE")
Long tpDuree;

// Constructeurs, getters, setters

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 29
Many To Many Unidirectionnelle

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 30
Many To Many Bidirectionnelle

• Many To Many : La Formation a plusieurs TPs (TP1, TP2, …). Un


même TP peut être lié à plusieurs formations (Maven, Spring,
JPA, JSF).
• Bidirectionnelle : La formation a plusieurs TPs et les connait.
Chaque TP est associé à plusieurs Formations, et les connait
aussi.

* *
T_FORMATION T_TP

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 31
Many To Many Bidirectionnelle
@Entity
@Table(name = "T_FORMATION")
public class Formation implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue (strategy = [Link])
@Column(name="FORMATION_ID")
private Long id; // Identifiant formation (Clé primaire)

@Column(name="FORMATION_THEME")
private String theme; // Thème formation

@OneToOne(cascade = [Link])
@JoinColumn(name="FK_FD_ID")
private FormationDetail formationDetail;

@ManyToMany(cascade = [Link])
private Set<TravauxPratiques> formationTps;

// Constructeurs, getters, setters

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 32
Many To Many Bidirectionnelle
@Entity
@Table(name = "T_TP")
public class TravauxPratiques implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = [Link])
@Column(name="TP_ID")
Long tpId;

@Column(name="TP_SUJET")
String tpSujet;

@Column(name="TP_DUREE")
Long tpDuree;

@ManyToMany(mappedBy="formationTps", cascade = [Link])


private Set<Formation> formations;

// Constructeurs, getters, setters

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 33
Many To Many Bidirectionnelle

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 34
CASCADE

@ManyToMany(cascade = {[Link], [Link]},


fetch=[Link])
private Set<TravauxPratiques> formationTps;

• [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 formation, alors les Tps de cette
formation seront supprimés (pour éviter d’avoir des Tps orphelins : sans formation).

• [Link] : Cascade l’opération PERSSIT (Ajout) du parent vers le


child. Ci-dessus, quand on ajoute une formation, alors, si l’objet formation ajouté
contient des Tps, la formation et les Tps seront ajoutés.

• Par défaut (si on ne met pas CascadeType), aucune opération n’est cascadée.

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 35
FETCH

@ManyToMany(fetch=[Link])
private Set<TravauxPratiques> formationTps;

• [Link] (avec impatience): Quand on récupère une formation de la


base de données, tous les TP (TravauxPratiques) liés à cette formation seront
récupérés eux aussi.

• [Link] (avec paresse): Quand on récupère une formation de la base de


données, aucun TP lié à cette formation ne sera récupéré, jusqu’à ce que nous
faisons un appel explicite dans le code : [Link] par exemple (f étant une
instance de Formation).

• 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.

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 36
Exercice

NB : la relation Fournisseur-Produit est une


relation unidirectionnelle

Figure 1 : Diagramme de classes gestion


Magasin/Stock
© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité 37
Travail à faire

TP gestion Magasin/Stock (Diagramme de classe page 37)

Spring Data JPA – Entités et Associations :

Créer les entités Produit DetailProduit Rayon Fournisseur et l’Enum


CategorieProduit se trouvant dans le diagramme des classes (sans les
associations) et vérifier qu’ils ont été ajoutés avec succès dans la base de
données.

Ne codez pas toutes les entités. Ce sera plus tard (on aura 2 séances
pratiques).

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations 38
Spring Data JPA – Associations

Si vous avez des questions, n’hésitez pas à nous


contacter :

Département Informatique
UP Architectures des Systèmes d'Information
Bureau E204

© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations

Vous aimerez peut-être aussi