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 unidirectionnelle

Nous allons voir maintenant une relation OneToMany unidirectionnelle entre une classe F et une classe G. Le lien ce fera de F vers G.

Diagramme de classes

Code Java

Code de la classe F :

  1. @Table( name = "T_TABLE_F" )
  2. public class ClasseF implements Serializable
  3. {
  4.   @Id
  5.   @GeneratedValue( strategy = GenerationType.IDENTITY )
  6.   @Column( name = "F_ID" )
  7.   private Long id;
  8.  
  9.   @Column( name = "F_REMARQUE" )
  10.   private String remarque;
  11.  
  12.   @OneToMany
  13.   @JoinColumn( name = "F_ID_FK")
  14.   private List< ClasseG > listeG;
  15. ...

Télécharger

Nous pouvons accéder à une liste d’éléments de type G à partir d’un objet F. L’annotation @JoinColumn permet de spécifier le champ F_ID_FK comme nom du champ clé étrangère dans la table T_TABLE_G.

Code de la classe G :

  1. @Table( name = "T_TABLE_G" )
  2. public class ClasseG implements Serializable
  3. {
  4.   @Id
  5.   @GeneratedValue( strategy = GenerationType.IDENTITY )
  6.   @Column( name = "G_ID" )
  7.   private Long id;
  8.  
  9.   @Column( name = "G_REMARQUE" )
  10.   private String remarque;
  11. ...

Télécharger

Comme la relation est unidirectionnelle de de F vers G, ClasseG n’a pas d’attribut de type F.

Les tables correspondantes

Table correspondant à la classe F :

Table correspondant à la table G :

Nous voyons que la table G a bien une clé étrangère permettant de faire le lien avec la table F.

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

Script de la table F :

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

Télécharger

Script de la table G :

  1. CREATE TABLE `T_TABLE_G` (
  2.   `G_ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
  3.   `G_REMARQUE` VARCHAR(255) DEFAULT NULL,
  4.   `F_ID_FK` BIGINT(20) DEFAULT NULL,
  5.   PRIMARY KEY (`G_ID`),
  6.   KEY `FK_T_TABLE_G_F_ID_FK` (`F_ID_FK`),
  7.   CONSTRAINT `FK_T_TABLE_G_F_ID_FK` FOREIGN KEY (`F_ID_FK`) REFERENCES `T_TABLE_F` (`F_ID`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=latin1

Télécharger

Nous remarquons que nous acceptons que la clé étrangère puisse être nulle, c’est à dire, que nous autorisons qu’une instance de G ne soit pas forcément reliée à une instance de F. Si nous voulons forcer le lien, nous devons le spécifier dans dans le code de la classe F comme suit :

  1. @OneToMany
  2. @JoinColumn( name = "F_ID_FK", nullable = false )
  3. private List< ClasseG > listeG;

Télécharger

La génération des tables ne va modifier que la structure de la table G dont le champ F_ID_FK à maintenenant la propriété NOT NULL

Le script correspondant :

  1. CREATE TABLE `T_TABLE_G` (
  2.   `G_ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
  3.   `G_REMARQUE` VARCHAR(255) DEFAULT NULL,
  4.   `F_ID_FK` BIGINT(20) NOT NULL,
  5.   PRIMARY KEY (`G_ID`),
  6.   KEY `FK_T_TABLE_G_F_ID_FK` (`F_ID_FK`),
  7.   CONSTRAINT `FK_T_TABLE_G_F_ID_FK` FOREIGN KEY (`F_ID_FK`) REFERENCES `T_TABLE_F` (`F_ID`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=latin1

Télécharger

Article n° 48

Crée par: chris

Créé le: 19 septembre 2015

Modifié le: 19 septembre 2015

Nombre de visites: 1267

Popularité: 6 %

Popularité absolue: 2

Mots clés de cet article


SPIP

2003-2020 LePpf
Plan du site | | Contact | RSS 2.0

Visiteurs connectés : 7

Nombre moyen de visites quotidiennes sur le site: 286