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é.
T_FORMATION
T_FORMATION_DETAIL
1
1
© 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;
Advertisement
// 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.
T_FORMATION
T_FORMATION_DETAIL
1
1
© 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.
T_TP
T_TP_CORRECTION
1
*
© 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;
Advertisement
@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».
T_TP_CORRECTION
T_TP
*
1
© 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.
T_TP_CORRECTION
T_TP
*
1
• L’attribut mappedBy est défini pour l'annotation @OneToMany, mais
pas pour l'annotation @ManyToOne, car elle est toujours liée au
«Child».
Advertisement
© 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
Advertisement
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
FETCH CASCADE
@OneToMany(mappedBy="entreprise",
cascade = {CascadeType.PERSIST, CascadeType.REMOVE},
fetch=FetchType.EAGER)
private List<Departement> departements = new ArrayList<>();
© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations
35
Exercice
NB : la relation Fournisseur-Produit est une relation unidirectionelle
© 2021-2022 – ESPRIT – Module ARCHITECTURE DES SI II SPRING – Spring Data JPA – Associations
36
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ées 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
37
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