JPA : Exemples de mapping


Relation1,* avec JPA : Exemple d’une commande et ces lignes de commandes

Montre comment traduire une relation 1,n avec JPA

Même dans des relations simples de types 1,n, JPA   nous propose un certain nombre d’annotations qui produiront des mapping différent. Il peut être intéressant de les connaître et de voir ce que cela donne du coté bases de données.


 Relation 1 à plusieurs unidirectionnelle

Nous prendrons comme premier exemple le diagramme de classe suivant :

Il représente une relation un à plusieurs entre une classe Commande et ses lignes de commande. Cette relation est unidirectionnelle, c’est à dire que nous partons de la commande pour récupérer la liste de ces lignes de commandes.

Nous allons d’abord créer la classe LigneCde qui est une simple Entity qui n’a pas de lien vers une autre classe.

  1. @Table( name = "T_LIGNECDE_LCD")
  2. public class LigneCde implements Serializable
  3. {
  4.   private static final long serialVersionUID = 1L;
  5.  
  6.   @Id
  7.   @GeneratedValue( strategy = GenerationType.IDENTITY )
  8.   @Column( name = "LCD_ID")
  9.   private Long id;
  10.  
  11.   @Column( name = "LCD_ARTICLE" )
  12.   private String article;
  13.  
  14.   @Column( name = "LCD_QTE" )
  15.   private int qte;
  16. ...

Télécharger

Nous allons maintenant définir le code de la classe Commande.

  1. @Table( name = "T_COMMANDE_CDE" )
  2. public class Commande implements Serializable
  3. {
  4.   private static final long serialVersionUID = 1L;
  5.  
  6.   @Id
  7.   @GeneratedValue( strategy = GenerationType.IDENTITY )
  8.   @Column( name = "CDE_ID" )
  9.   private Long id;
  10.  
  11.   @Column( name = "CDE_NOM" )
  12.   private String nom;
  13.  
  14.   @OneToMany
  15.   private List< LigneCde > ligneCdes;
  16. ...

Télécharger

La seule particularité est l’attribut donnant la liste des lignes de commandes. L’annotation @OneToMany permet de spécifier le type de la relation.

Exécutons la génération de la base et voyons les tables qui ont été générées :

On voit que par défaut, 3 tables ont été générées. 2 tables correspondant aux 2 classes plus une table de jointure. Il est vraisemblable que si nous avions construit nous même cette base nous aurions utilisée une clé étrangère dans la table des lignes de commandes pour éviter une double jointure.

Il va donc falloir modifier nos annotations dans la classe Commande.

Il suffit d’ajouter l’annotation @JoinColumn et préciser le nom du champ qui servira de clé étrangère dans la table enfant des lignes de commandes. Ce qui donne :

  1. @OneToMany
  2. @JoinColumn( name ="CDE_ID_FK" )
  3. private List< LigneCde > ligneCdes;

Télécharger

Régénérons la base de données et voyons son contenu :

Nous avons bien nos 2 tables avec une clé étrangère dans la seconde.

Article n° 36

Crée par: chris

Créé le: 7 juillet 2015

Modifié le: 18 septembre 2015

Nombre de visites: 1043

Popularité: 100 %

Popularité absolue: 5

Mots clés de cet article


SPIP

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

Visiteurs connectés : 0

Nombre moyen de visites quotidiennes sur le site: 141