JPA : Exemple de Mapping


Relation 1,1 avec JPA : exemple du client et son adresse

2 classes, 2 tables ou 2 classes dans une table ?

Cet article décrit comment définir une relation de type 1,1 entre 2 classes puis, montre comment mapper ces 2 classes dans une table unique de la base de données.

Une relation de type 1,1 entre 2 classes est sans doute le type de relation le plus simple à définir mais il peut être utile de connaître les différentes possibilités que propose JPA   pour créer une base de données le plus efficacement possible.


 Présentation

L’exemple que nous allons utiliser va être le cas d’une relation entre un client et son adresse que l’on pourrait représenter à l’aide du diagramme suivant :

Ce diagramme de classes modélise le fait qu’un client est domicilié à une adresse et une seule.

 Solution 1 : Mapping dans 2 tables

Nous allons maintenant traduire nos 2 classes en langage Java mais comme nous désirons qu’elles soient persistantes, JPA   nous impose qu’elles aient un identifiant et la classe Adresse n’en possède pas. On va donc ajouter un attribut numérique nommé id qui servira d’identifiant à notre adresse.

Créons maintenant nos classes Java correspondant à ce diagramme de classes.

La classe Adresse pourrait correspondre code suivant (extrait) :

  1. @Table( name = "T_ADRESSE_ADR")
  2. public class Adresse implements Serializable
  3. {
  4.   private static final long serialVersionUID = 1L;
  5.  
  6.   @Id
  7.   @GeneratedValue
  8.   private Long id;
  9.  
  10.   @Column( name = "ADR_LIG1" )
  11.   private String ligne1;
  12.  
  13.   @Column( name = "ADR_LIG2" )
  14.   private String ligne2;
  15.  
  16.   @Column( name = "ADR_LIG3" )
  17.   private String ligne3;
  18.  
  19.   @Column( name = "ADR_LIG4" )
  20.   private String ligne4;
  21.  
  22.   @Column( name = "ADR_CP" )
  23.   private String codePostal;
  24.  
  25.   @Column( name = "ADR_COMMUNE" )
  26.   private String commune;
  27.  
  28.   @Column( name = "ADR_PAYS" )
  29.   private String pays;
  30.  
  31. geter/seter etc...

Télécharger

Rappel : Seules les annotations @Identity et @id sont obligatoires. @GeneratedValue précise que l’identifiant sera crée automatiquement, @Table et @Column permettent de définir un formalisme différent entre le nommage Java et SQL  .

La classe Client pourra être défini par le code suivant :

  1. @Table( name = "T_CLIENT_CLI")
  2. public class Client implements Serializable
  3. {
  4.   private static final long serialVersionUID = 1L;
  5.  
  6.   @Id
  7.   @GeneratedValue
  8.   @Column( name = "CLI_ID" )
  9.   private Long id;
  10.  
  11.   @Column( name = "CLI_NOM" )
  12.   private String nom;
  13.  
  14.   @Column( name = "CLI_PRENOM" )
  15.   private String prenom;
  16.  
  17.   @OneToOne
  18.   private Adresse adresse;
  19.  
  20. geter/seter etc...

Télécharger

Si l’on demande la génération de la base, nous obtenons les tables suivantes :

et

Nous obtenons dans la table des clients, un champ ADRESSE_ID qui correspond à l’identifiant de l’adresse du client se trouvant dans la table T_ADRESSE_ADR. Il s’agit d’une clé étrangère.

On peut ajouter quelques annotations sur l’attribut Adresse. On peut préciser que les opérations de suppression etc... sur la table des clients se répercutent en cascade sur la tables des adresses. Avec l’annotation @JoinColumn on va pouvoir préciser le nom du champ et imposer qu’il ne soit pas nul pour qu’un client ait obligatoirement une adresse.

  1. @OneToOne( cascade = CascadeType.ALL )
  2. @JoinColumn( name = "CLI_ADRESSE_FK", nullable = false )
  3. private Adresse adresse;

Télécharger

Si on relance la génération de la base, on vois par exemple que le nom du champ a changé et que Null est passé à NO.

Article n° 24

Crée par: chris

Créé le: 27 mai 2015

Modifié le: 18 septembre 2015

Nombre de visites: 1185

Popularité: 3 %

Popularité absolue: 1

Mots clés de cet article


SPIP

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

Visiteurs connectés : 22

Nombre moyen de visites quotidiennes sur le site: 247