vers l'accueil formulaire de contact

Tutoriel Hibernate N°4 : mapping association Many-to-one

Votre formation HIBERNATE avec Objis, spécialiste formation java depuis 2005 Mettez en oeuvre une relation de persistance Many-to-one unidirectionnelle avec hibernate. Créez les fichiers de mappings et le code Java des objets métiers impliqués dans la relation. 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), disponible par défaut dans hibernate 3. Identifiez les nuances entre les méthodes de chargement session.get() et session.load() . Mettez en pratique l’attibut ’cascade’. Enfin, rendez l’association bidirectionelle.

Objis, spécialiste de la formation Java, est heureux de vous offrir ce tutoriel, extrait de séances pratiques de la formation HIBERNATE dispensée par Objis.

Les + objis
- 70% de travaux pratiques
- Clé USB avec tous les outils utilisés + Corrigés TPs
- Bilan pédagogique individuel + conseils

Prérequis, outils et versions

- Tutoriel Hibernate N°2 : votre première application hibernate

Liens utiles


- + de 100 tutoriaux java/jee Objis
- Tutoriaux HIBERNATE Objis
- Objis, spécialiste formation java depuis 2005
- Site hibernate (javadoc, faq)
- Doc référence Hibernate
- Documentation (chap. 10) : working with objects

Objectifs

- Comprendre les logs générés par Hibernate
- Analysez certaines configurations par défaut.

Programme

- Contexte
- Partie 1 : Aspect statique : Fichiers de mapping
- Partie 2 : Aspect statique : Classes Java
- Partie 3 : Aspect dynamique : Persistance des objets
- Partie 4 : Aspect dynamique : Chargement objets avec session.load
- Partie 5 : Aspect dynamique : Chargement objets avec session.get()
- Partie 6 : Valeur ajoutée d’un proxy

Durée

30 min.

Contexte

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

PNG - 24.9 ko
tutoriel-hibernate-association-many-to-one-contexte

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 peux se dérouler dans un même lieu.

PNG - 4 ko
tutoriel-hibernate-objis-association-many-to-one-1

La relation se veut unidirectionelle : il doit être possible uniquement de retrouver le lieu d’une formation à partir de la connaissance de cette formation.

Partie 1 : Fichiers de mapping

- Analysez le contenu du fichier de mapping de Formation (Formation.hbm.xml)

PNG - 15.7 ko
tutoriel-hibernate-objis-association-many-to-one-2

- Analysez le fichier de mapping de Lieu

PNG - 10.8 ko
tutoriel-hibernate-objis-association-many-to-one-3

- Expliquez

Partie 2 : Classes Java

La classe Formation contiendra un attribut ’lieu’ qui correspondra à une colonne de clé étrangère dans la table FORMATIONS.

PNG - 26.4 ko
tutoriel-hibernate-objis-association-many-to-one-4

REMARQUE : notez la présence du constructeur sans argument. Il sera indispensable dans les parties suivantes, durant lesquelles vous souhaiterez chargement en mémoire une formation à partir d’une clé primaire.

L’outil de génération de code JAVASSIST (préféré depuis hibernate 3 à l’outil CGLIB) permet par instrumentation de créer des proxy.

- Analysez le code de la classe Lieu

PNG - 17.2 ko
tutoriel-hibernate-objis-association-many-to-one-5

- Expliquez

Partie 3 : Persistance

Dans cette partie, vous allez rendre persistant les classes Formation, Lieu en conservant leur relation Many-to-one.

- Analysez le code suivant

PNG - 21.2 ko
tutoriel-hibernate-objis-association-many-to-one-6

- Expliquez ce que fais ce code.

QUESTION : Comment rendre ce code plus robuste ?

Partie 4 : Chargement objets avec session.load()

Dans cette partie, vous allez charger en mémoire les objets Formation et Lieu à partir de leur identifiant clé primaire en base de données.

La méthode utilisée est la méthode session.load(), qui a la particularité de générer un proxy de l’objet. L’avantage est qu’il n’y a pas physiquement de SELECT en base.

PNG - 19.8 ko
tutoriel-hibernate-objis-association-many-to-one-10bis

- Expliquez

PNG - 6.1 ko
tutoriel-hibernate-objis-association-many-to-one-7

- Expliquez la valeur Formation_$$javassist_1 de la variable formation, juste après la ligne 56.

PNG - 8.2 ko
tutoriel-hibernate-objis-association-many-to-one-8

- Expliquez la valeur Formation_$$javassist_1 de la variable lieu, juste après la ligne 59.

PNG - 11 ko
tutoriel-hibernate-objis-association-many-to-one-9

- Expliquez la requête sql suivante, générée juste après la ligne 60. Montrez le lien avec la notion de Lazy loading ou Retard au chargement.

PNG - 3.2 ko
tutoriel-hibernate-objis-association-many-to-one-9bis

Hibernate a attendu le ’dernier moment’ pour réaliser une requête en base de données. Il a attendu que vous sollicitiez une effectiveent une des propriétés de l’objet.

Sans quoi vous auriez pu récuperer l’id de l’objet lieu sans avoir à faire de select. Particulièrement utile pour naviguer entre des objets/tables sans charger tous les objets intermédiaires en mémoire.

PNG - 6.5 ko
tutoriel-hibernate-objis-association-many-to-one-10

Version JPA de la méthode hibernate load()

INFO : En JPA, l’équivalent de session.load() est em.getReference(). INFO : notez que la notion de proxy n’existe pas formellement en JPA

Partie 5 : Chargement objets avec session.get()

La méthode utilisée est la méthode session.get(), qui aura comme impact la génération physiquement d’un SELECT en base.

PNG - 16.6 ko
tutoriel-hibernate-objis-association-many-to-one-11

- Expliquez

PNG - 8.4 ko
tutoriel-hibernate-objis-association-many-to-one-12

- Expliquez

PNG - 5.8 ko
tutoriel-hibernate-objis-association-many-to-one-13

Version JPA de la méthode hibernate get()

INFO : En JPA, l’équivalent de session.get() est em.find().

Partie 6 : valeur ajoutée d’un proxy hibernate et du mode lazy

- Analysez le code suivant, dont l’objectif est de rendre persistant une formation dont le lieu n’est connu qu’à travers sa clé primaire.

BMP - 987.4 ko
tutoriel-hibernate-demo-valeur-ajoutee-proxy-1

- Analysez le code SQL produit.

Notez qu’il n’y a pas eu de SELECT pour rechercher l’objet lieu ! seul son id nous intéressait.

BMP - 348 ko
tutoriel-hibernate-demo-valeur-ajoutee-proxy-2

Remarque : dans certains cas , vous ne souhaiterez pas bénéficier de ce type de comportement appelé retard au chargement (lazyloading). Vous souhaiterez charger certains objets du graphe systématiquement ensemble. Il s’agit de la notion de fetching,

Partie 7 : valeur ajoutée de l’attribut ’cascade’

- Montrez que le code suivant produit une erreur suivante : Exception in thread "main" org.hibernate.TransientObjectException : object references an unsaved transient instance - save the transient instance before flushing : com.objis.demohibernate.complexe.Lieu

PNG - 17.6 ko
tutoriel-hibernate-objis-association-many-to-one-14

- Montrez que l’utilisation de l’attribut ’cascade’ permet de gérer cette erreur. Paramétrez le fichier de mapping de la classe Formation pour gérer ce problème.

En particulier, expliquez le mapping suivant :

PNG - 14.6 ko
tutoriel-hibernate-objis-association-many-to-one-15

- quelle différence entre cascade=all et cascade=save-update ? Expliquez.
- Que signifie cascade=all-delete-orphan ?

Partie 8 : rendre l’association bidirectionelle

- Modifiez le code et le mapping de la classe Lieu afin de rendre l’association bidirectionnelle.

PNG - 15.7 ko
tutoriel-hibernate-objis-association-many-to-one-16

- Expliquez

PNG - 18 ko
tutoriel-hibernate-objis-association-many-to-one-17

- Expliquez

Zip - 4.7 Mo
demohibernate_association_bidirectionnelle
PNG - 16.6 ko
tutoriel-hibernate-objis-association-many-to-one-19

Partie 9 : Association Many-to-many

Analysez le projet eclipse suivant :

Zip - 5 Mo
demoHibernateAssoManyToMany

Rejoignez le club Objis pour une analyse de ce code et une maîtrise du mapping Many-to-Many Hibernate.

Conclusion

Dans ce tutoriel, vous avez mis en œuvre une relation Many-to-one avec Hibernate. Vous savez comment rendre persistant une une relation Many-to-one. Vous savez également comment charger des Objets métiers impliqués dans une relation Many-to-one à partir de leur identifiant clé primaire.

Vous avez identifié les nuances de chargement via méthode load() et méthode get(). En particuliers, vous avez compris la valeur ajoutée du Lazy loading (retard du chargement).

Vous avez compris la valeur ajoutée de l’attribut cascade dans une relation d’association.

Enfin, vous avez identifié une maneoeuvre permettant d’assurer la bidirectionnalité de la relation, en particulier grace à l’attribut ’inverse’

Prochaine formation HIBERNATE

Le chemin le plus court pour avoir les réflexes et la méthodologie du bon développeur Hibernate :

Votre formation HIBERNATE avec Objis, spécialiste formation java depuis 2005

Pour aller plus loin : le réseau Objis

Si vous appréciez notre sens du partage, devenez gratuitement membre ’classic’ du Club Objis :
- Votez pour les prochains tutoriaux à publier
- Préparez vos entretiens techniques
- Valorisez votre profil / expertise
- Identifiez des opportunités d’emploi
- Recevez la newsletter objis.com