Mapping avec JPA


De UML à SQL : Relation ManyToMany

Article faisant partie d’une série présentant les différentes annotations permettant de traduire des relations entre classes persistantes en bases de données relationnelles.

 Relation ManyToMany

Une relation ManyToMany est généralement utilisée dans les 2 sens ; nous allons donc voir ce type de relation entre 2 classes J et K.

Diagramme de classes

Dans ce cas, nous devrons obligatoirement nous retrouver avec trois tables dont une de jointure.

Code Java

Code de la classe J

  1. @Table( name = "T_TABLE_J" )
  2. public class ClasseJ implements Serializable
  3. {
  4.   @Id
  5.   @GeneratedValue( strategy = GenerationType.IDENTITY )
  6.   @Column( name = "J_ID" )
  7.   private Long id;
  8.  
  9.   @Column( name = "J_REMARQUE" )
  10.   private String remarque;
  11.  
  12.   @ManyToMany( mappedBy = "listeJ" )
  13.   private List< ClasseK > listeK;
  14. ...

Télécharger

Nous avons défini un attribut liste d’objets K et nous précision dans l’annotation que le lien est mappé avec l’attribut listeJ qui sera définie dans la classe K.

Code de la classe K

  1. @Table( name = "T_TABLE_K" )
  2. public class ClasseK implements Serializable
  3. {
  4.   @Id
  5.   @GeneratedValue( strategy = GenerationType.IDENTITY )
  6.   @Column( name = "K_ID" )
  7.   private Long id;
  8.  
  9.   @Column( name = "K_REMARQUE" )
  10.   private String remarque;
  11.  
  12.   @ManyToMany
  13.   @JoinTable( name = "TJ_JK",
  14.           joinColumns        = @JoinColumn( name = "K_ID_FK" ),
  15.           inverseJoinColumns = @JoinColumn( name = "J_ID_FK" )
  16.   )
  17.   private List< ClasseJ > listeJ;
  18. ...

Télécharger

Dans cette classe, nous utilisons l’annotation JoinTable pour définir le nom de la table de jointure et de ces champs qui devront correspondre aux deux clés étrangères correspondant aux clés primaires des 2 tables.

Les tables correspondantes

Structure de la table J :

Structure de la table K :

Structure de la table de jointure :

Et voici le script SQL   permettant de générer les tables :

Script de la table T_TABLE_J :

  1. CREATE TABLE `T_TABLE_J` (
  2.   `J_ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
  3.   `J_REMARQUE` VARCHAR(255) DEFAULT NULL,
  4.   PRIMARY KEY (`J_ID`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=latin1

Télécharger

Script de la table T_TABLE_K :

  1. CREATE TABLE `T_TABLE_K` (
  2.   `K_ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
  3.   `K_REMARQUE` VARCHAR(255) DEFAULT NULL,
  4.   PRIMARY KEY (`K_ID`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=latin1

Télécharger

Script de la table de jointure :

  1. CREATE TABLE `TJ_JK` (
  2.   `J_ID_FK` BIGINT(20) NOT NULL,
  3.   `K_ID_FK` BIGINT(20) NOT NULL,
  4.   PRIMARY KEY (`J_ID_FK`,`K_ID_FK`),
  5.   KEY `FK_TJ_JK_K_ID_FK` (`K_ID_FK`),
  6.   CONSTRAINT `FK_TJ_JK_K_ID_FK` FOREIGN KEY (`K_ID_FK`) REFERENCES `T_TABLE_K` (`K_ID`),
  7.   CONSTRAINT `FK_TJ_JK_J_ID_FK` FOREIGN KEY (`J_ID_FK`) REFERENCES `T_TABLE_J` (`J_ID`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=latin1

Télécharger

Nous pouvons vérifier que la clé primaire est composée des deux champs de la table et que chacun est également clé étrangère pour faire le lien entre les 2 autres tables.

 Conclusion

Nous venons de voir les différentes annotations qui permettent de définir tous les éléments des tables entrant en jeux pour gérer une relation ManyToMany. En matière de bases de données relationnelle, il existe des relations N,N avec des attributs qui dépendent des 2 entités. Ce cas est un peu plus complexe et sera traité dans un autre article.

Article n° 50

Crée par: chris

Créé le: 19 septembre 2015

Modifié le: 19 septembre 2015

Nombre de visites: 1238

Popularité: 20 %

Popularité absolue: 2

Mots clés de cet article


SPIP

2003-2024 LePpf
Plan du site | | RSS 2.0 | Sur YouTube

Visiteurs connectés : 2

Nombre moyen de visites quotidiennes sur le site: 208