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
Partie 1 : Contexte
Considérez le modèle métier suivant :
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.
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’
Entité JPA ‘Lieu’
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
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 :
Expliquez ce que fait ce code.
En déduire l’impact sur la base de données (initialement vide de tables)
Exécution programme v2
Analysez le code suivant :
Expliquez ce que fait ce code.
Exécuter ce code
En exécutant le code de la classe DemoJPA, nous avons l’erreur suivante
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’.
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()
Notez la requête générée systématiquement par le find :
avec la méthode getReference()
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.
Ajouter Getter/Setter
Remarque :
le caractère bidirectionnel est marqué en définissant l’attribut mappedBy sur la relation.
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).
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).
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 ?