Mapping avec JPA


De UML à SQL : Relation OneToMany

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 OneToMany bidirectionnelle

Dans le cas précédent nous ne pouvions pas aller directement de G vers F.
Nous allons maintenant définir deux classes H et J avec une relation OneToMany bidirectionnelle.

Diagramme de classes

Code java

La classe H

  1. @Table( name = "T_TABLE_H" )
  2. public class ClasseH implements Serializable
  3. {
  4.   @Id
  5.   @GeneratedValue( strategy = GenerationType.IDENTITY )
  6.   @Column( name = "H_ID" )
  7.   private Long id;
  8.  
  9.   @Column( name = "H_REMARQUE" )
  10.   private String remarque;
  11.  
  12.   @OneToMany( mappedBy = "classeH" )
  13.   private List< ClasseI > listeI;
  14. ...

Télécharger

Par rapport à l’exemple précédent, nous spécifions que la relation va être mappée sur classeH, attribut qui va être ajouté dans la classe I et qui nous permettra d’aller de I vers H.

La classe I

  1. @Table( name = "T_TABLE_I" )
  2. public class ClasseI implements Serializable
  3. {
  4.   @Id
  5.   @GeneratedValue( strategy = GenerationType.IDENTITY )
  6.   @Column( name = "I_ID" )
  7.   private Long id;
  8.  
  9.   @Column( name = "I_REMARQUE" )
  10.   private String remarque;
  11.  
  12.   @ManyToOne
  13.   @JoinColumn( name = "H_ID_FK" )
  14.   private ClasseH classeH;
  15. ...

Télécharger

Nous avons défini un nouvel attribut que nous avons annoté @ManyToOne et nous spécifions le nom du champ clé étrangère dans la table correspondante.

Tables correspondantes

Table H :

Table I :

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

Script de la table H :

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

Télécharger

Script de la table I :

  1. CREATE TABLE `T_TABLE_I` (
  2.   `I_ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
  3.   `I_REMARQUE` VARCHAR(255) DEFAULT NULL,
  4.   `H_ID_FK` BIGINT(20) DEFAULT NULL,
  5.   PRIMARY KEY (`I_ID`),
  6.   KEY `FK_T_TABLE_I_H_ID_FK` (`H_ID_FK`),
  7.   CONSTRAINT `FK_T_TABLE_I_H_ID_FK` FOREIGN KEY (`H_ID_FK`) REFERENCES `T_TABLE_H` (`H_ID`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=latin1

Télécharger

Nous pouvons remarquer, comme pour les relations OneToOne, que le fait qu’une relation entre 2 classes soit uni ou bidirectionnelle, cela n’a pas d’incidence sur la structure de la base de données.

 Conclusion

Nous venons de voir quelles annotations utiliser pour définir une relation OneToMany. Attention : selon le choix de vos annotations, JPA   peut vous générer une table de relation supplémentaire ajoutant une jointure alors que c’est inutile dans les relations de 1 à n en bases de données.

Vous trouverez un exemple concret d’une relation OneToMany dans l’article Relation1,* avec JPA : Exemple d’une commande et ces lignes de commandes

Article n° 48

Crée par: chris

Créé le: 19 septembre 2015

Modifié le: 19 septembre 2015

Nombre de visites: 3271

Popularité: 13 %

Popularité absolue: 2

Mots clés de cet article


SPIP

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

Visiteurs connectés : 0

Nombre moyen de visites quotidiennes sur le site: 215