Tutoriel JPA N°4 : Mapping association Many-to-one

/////Tutoriel JPA N°4 : Mapping association Many-to-one

Mettez en œuvre une relation de persistance Many-to-one unidirectionnelle avec hibernate. Rendez cette relation persistante en base de données. Puis récupérez dynamiquement les objets métiers à partir de leur identifiant clé primaire. Comprenez et mettez en pratique le retard au chargement (Lazy loading). Mettez en pratique l’attribut ’cascade’. Enfin, rendez l’association bidirectionnelle.

Dans le tutoriel suivant tutoriel JPA N°5 , mettez en œuvre la mapping collections .

Objis : spécialiste JAVA depuis 2005

Touchez du doigt notre approche pédagogique (70% de pratique) à travers ce tutoriel. Comme nos clients, contactez-nous (contact@objis.com) pour vos besoins en assistance technique ou en formations sur mesure dans nos locaux, dans vos locaux ou à distance.

ASTUCE –> Soyez informé de la mise à jour de nos tutos ou de la création de nouveaux tutos.

Prérequis

 Tutoriel JPA N°2 : votre première application JPA

Liens utiles

 + de 100 tutoriaux java/jee Objis

 Vos premiers pas de programmeur JEE

 Objis, spécialiste formation java depuis 2005

 Catalogue formations Objis

Objectifs

 Mettre en oeuvre un mapping ’Plusieurs à un’

Programme

 Partie 1 :Contexte

 Partie 2 : Mapping

 Partie 3 : Persistance

 Partie 4 : Attribut Cascade

 Partie 5 : Rendre l’association bidirectionnelle

 Partie 6 : Chargement en mode Lazy ou Eager

 conclusion

Durée

 25 min

PUBLICITE : votre formation ‘Intégration continue’ avec Objis

formation-integration-continue-usine-logicielle-objis-maillons

Partie 1 : Contexte

Considérez le modèle métier suivant :
Jpa_1

Vous êtes chargé de modéliser une relation Plusieurs-vers-un entre un objet métier Formation et un objet métier ’Lieu’.

Plusieurs formations peuvent se dérouler dans un même lieu.
Jpa_2

Partie 2 : Mapping

Avec JPA, la description du mapping entre le bean entité et la table peut être faite en utilisant les annotations ou un fichier XML de mapping.
Dans notre cas nous allons travailler avec les annotations.

Afin que JPA puisse faire le lien entre un objet Java et la base de données, les classes à mapper sont définies en tant qu’entité JPA. Pour ce faire, on les déclare avec l’annotation @Entity. Elle doit également comporter au moins un attribut déclaré comme clé primaire à l’aide de l’annotation @Id.

De plus, les objets mappés doivent posséder un constructeur sans paramètre et des accesseurs (getters/setters) pour tous ses attributs.

Entité JPA ‘Formation’

Jpa_6

Entité JPA ‘Lieu’

Jpa_4

La clé primaire peut être générée automatiquement en utilisant l’annotation @javax.persistence.GeneratedValue .
Le type AUTO est le plus généralement utilisé, il laisse l’implémentation générer la valeur de la clé primaire.

Partie 3 : Persistance

Dans cette partie, vous allez rendre persistant les classes Formation et Lieu avec la relation Many-to-one unidirectionnelle : il sera possible de retrouver le lieu d’une formation donnée.

 Veuillez modifier la classe Formation pour ajouter la relation Many-to-one entre les entités Formation et Lieu
Jpa_5

 Ajoutez dans la classe ‘Formation’ les méthodes getter et setter associées à Lieu

 Ajoutez également dans ‘Formation’ un constructeur de ayant les paramètres : theme, dateDebut, durée, lieu.

Fichier persistence.xml

Le fichier persistence.xml contient la configuration de base pour le mapping notamment en fournissant les informations sur la connexion à la base de données,

Exécution programme v1

 Analysez le code suivant :

jpa-hibernate-hbm2ddl-1

 Expliquez ce que fait ce code.

En déduire l’impact sur la base de données (initialement vide de tables)

jpa-hibernate-hbm2ddl

Exécution programme v2

 Analysez le code suivant :
Jpa_7

 Expliquez ce que fait ce code.

 Exécuter ce code

En exécutant le code de la classe DemoJPA, nous avons l’erreur suivante

Jpa_8

 Expliquez cette erreur

 Proposez 2 pistes pour gérer cette erreur :

— > Une première piste consiste à créer deux transactions distinctes pour persistencer les entités

— > une deuxième piste (voir partie 4) consiste à utiliser l’attribut ‘Cascade’ de l’annotation ManyToOne

Partie 4 : Utilisation de l’attribut Cascade

L’ajout de l’attribut ’cascade’ à la relation Many-to-one de la classe Formation permet de gérer l’erreur.

 Expliquez la configuration suivante de l’entité ‘Formation’.

Jpa_9

 Montrez que cette configuration résoud le problème de persistance précédent.

 Proposez une configuration de l’attribut Cascade plus fine spécifiquement adaptée à notre besoin.

Pour plus d’informations sur l’attribut cascade, vous pouvez consulter la documentation sur le site d’Oracle .

Partie 4 : Chargement Objet avec les méthodes find et getreference

La classe EntityManager possède les méthodes find() et getReference() pour la recherche par clé primaire.
La différence entre les deux, est que getReference() Utilise un proxy pour récupérer une référence sur l’objet sans réellement le charger .

 avec la méthode find()
Jpa_10

Notez la requête générée systématiquement par le find :

jpa-hibernate-find

 avec la méthode getReference()
Jpa_10

QUESTION : quand utiliser la méthode find ? quand utiliser getReference ?

Vous pouvez aussi voir la comparaison à cette adresse pour plus d’informations .

Partie 5 : Rendre l’association bidirectionnelle

 Modifiez le code de la classe Lieu afin de rendre l’association bidirectionnelle.
Jpa_11

 Ajouter Getter/Setter

 Remarque :
le caractère bidirectionnel est marqué en définissant l’attribut mappedBy sur la relation.

Jpa_11

Partie 6 : Chargement en mode Lazy ou Eager

Pour récupérer les éléments d’une collection contenu dans un objet, on a deux possibilités :

 Soit on effectue la récupération des éléments de la collection, dès que l’on récupère l’objet et donc on initialise la collection. C’est le Fetch Type « eager » (fetch=FetchType.EAGER).
Jpa_11

 Soit on n’effectue la récupération des éléments de la collection que à la demande, c’est à dire dès que l’on aura besoin de la collection. C’est le Fetch Type « lazy » (fetch=FetchType.LAZY).
Jpa_11

Pour plus d’informations, vous pouvez consulter leur documentation à cette adresse

Conclusion

Dans ce tutoriel JPA N°4 d’Objis, vous avez pu mettre en oeuvre une relation de persistance Many-to-one .

Dans le tutoriel suivant tutoriel JPA N°5 , vous allez mettre en œuvre le mapping de collections .

Votre avis nous intéresse

Vous avez remarqué une erreur ? Vous avez une recommandation pour améliorer ce tuto ? Vous souhaitez nous encourager à partager notre savoir-faire technique et pédagogique ?

Donner votre avis sur ce Tuto objis.com


2018-01-29T18:45:23+01:00

Contactez nous

241 rue DUGUESCLIN, 69003 Lyon

Web : Objis : spécialiste formation Java