SPRING DATA JPA – ASSOCIATIONS

Programming, Database Management · course

Browse all gestion et économie documents

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