Vous êtes sur la page 1sur 39

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 = GenerationType.IDENTITY)
@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 = GenerationType.IDENTITY)
@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 = GenerationType.IDENTITY)
@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 = GenerationType.IDENTITY)
@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 = GenerationType.IDENTITY)
@Column(name="TP_ID")
Long tpId;

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

@OneToMany(cascade = CascadeType.ALL)
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 = GenerationType.IDENTITY)
@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 = GenerationType.IDENTITY)
@Column(name="TC_ID")
private Long tcId;

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

@ManyToOne(cascade = CascadeType.ALL)
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 = GenerationType.IDENTITY)
@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 = GenerationType.IDENTITY)
@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 = GenerationType.IDENTITY)
@Column(name="TP_ID")
Long tpId;

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

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

@OneToMany(cascade = CascadeType.ALL, 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 = GenerationType.IDENTITY)
@Column(name="FORMATION_ID")
private Long id; // Identifiant formation (Clé primaire)

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

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="FK_FD_ID")
private FormationDetail formationDetail;

@ManyToMany(cascade = CascadeType.ALL)
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 = GenerationType.IDENTITY)
@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 = GenerationType.IDENTITY)
@Column(name="FORMATION_ID")
private Long id; // Identifiant formation (Clé primaire)

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

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="FK_FD_ID")
private FormationDetail formationDetail;

@ManyToMany(cascade = CascadeType.ALL)
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 = GenerationType.IDENTITY)
@Column(name="TP_ID")
Long tpId;

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

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

@ManyToMany(mappedBy="formationTps", cascade = CascadeType.ALL)


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(mappedBy="formationTps",
cascade = {CascadeType.PERSIST, CascadeType.REMOVE},
fetch=FetchType.EAGER)
private Set<Formation> formations;

• CascadeType.ALL : Cascade toutes les opérations (PERSSIT, REMOVE, …) du


parent vers le child.

• CascadeType.REMOVE : 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).

• CascadeType.PERSIST : 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=FetchType.EAGER)
private Set<TravauxPratiques> formationTps;

• FetchType.EAGER (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.

• FetchType.LAZY (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 : f.formationTps 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

Partie 2 Spring Data JPA – Le mapping des différentes associations

Dans le projet tp magasin/Stock et après avoir créer les entités lors de la dernière
séance, vous devez :

• Supprimer les tables existantes dans la base de données.


• Créer les associations entre les différentes entités.
• Générer la base de donné de nouveau et vérifier que le nombre de tables crées
est correcte.

© 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