vers l'accueil formulaire de contact

Tutoriel hibernate N°13 : stratégies de fetching et optimisations requêtes générées

Votre formation HIBERNATE avec Objis, spécialiste formation java depuis 2005 Maîtrisez les stratégies fetching hibernate. Comprenez la notion de tech. Comprenez la valeur ajoutée du fetching pour l’optimisation de vos requêtes hql. Trouvez la bonne stratégie de fetch pour vos objets détachés. Identifiez l’impact de la stratégie de fetch sur les requêtes SQL générées par Hibernate. Comprenez les paramétrages ’fetch=join’ , ’batch-size=N’, ’fetch=subselect’.

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)
- Documentation (chap. 19) : improving performance
- Article sur Stratégies de fetch
- Tutoriel Stratégies de Fetch

Objectifs

- Créer une couche DAO hibernate
- Mettre en œuvre Designs patterns avec Hibernate : Service locator, DAO, Business Delegate

Programme

- Partie 1 : stratégie globale par défaut (lazy="true")
- Partie 2 : suppression locale du lazy (lazy="false")
- Partie 3 : stratégie locale de fetch par jointure externe (fetch="join")
- Partie 4 : stratégie locale de fetch par batch prédéfinis(batch-size="10")
- Partie 5 : stratégie locale de fetch par sous-select (fetch="subselect")
- Partie 6 : Retarder le chargement des propriétés d’un objet

Durée

30 min.

Contexte

Avec hibernate, récupérez vos données avec 2 objectifs en tête :

1) Minimiser le nombre de requêtes SQL générées par Hibernate

2) Simplifier les requêtes SQL générées.

Choisir une stratégie de fetch avec hibernate, c’est choisir SI et COMMENT vos données seront récupérées.

Paramétrage statique et dynamique

Hibernate vous permet de mettre en place une stratégie de fetch d’une part à travers un paramétrage des fichier de mapping , mais AUSSI programmatiquement (ds cadre d’une requête particulière) avec FetchMode.

Partie 1 : stratégie par défaut (lazy="true")

Entité Participant
- Analysez le mapping de la classe Participant

PNG - 14.9 ko
tutoriel-hibernate-fetching-collection-0

- Test unitaire de la méthode création Participant

PNG - 7.7 ko
tutoriel-hibernate-fetching-collection-3

Résultat :

PNG - 6.3 ko
tutoriel-hibernate-fetching-collection-0ter

Entité Formation
- Analysez le mapping de la classe Formation

PNG - 16.3 ko
tutoriel-hibernate-fetching-collection-1bis

- Test unitaire de la méthode création Formation

PNG - 5 ko
tutoriel-hibernate-fetching-collection-4

Résultat :

PNG - 4.5 ko
tutoriel-hibernate-fetching-collection-1ter

REMARQUE : le participant n’est associé à aucune formation (champ formation_ID à null)

- Analysez le code suivant, présent dans la couche service de notre architecture. Que tente de faire ce code ?

PNG - 16 ko
tutoriel-hibernate-fetching-collection-2

- Test unitaire de la méthode Ajout Participant à Formation

PNG - 4.1 ko
tutoriel-hibernate-fetching-collection-5

- Expliquez l’erreur obtenue suite à l’exécution tu test unitaire : ERROR org.hibernate.LazyInitializationException - failed to lazily initialize a collection of role : com.objis.demohibernate.domaine.Formation.participants, no session or session was closed

PNG - 43.6 ko
tutoriel-hibernate-fetching-collection-6

Partie 2 : suppression du lazy (lazy="false")

- Sans changer le mapping de participant, modifiez le code du mapping Formation de la façon suivante :

PNG - 12.8 ko
tutoriel-hibernate-fetching-collection-10

- Quelle différence ?

- Relancez la méthode d’ajout d’un participant à une formation....ça passe !

PNG - 15.6 ko
tutoriel-hibernate-fetching-collection-11

- Analysez le code de la requête générée par hibernate :

texte - 1.6 ko
requete_fetch_lazy_false

Equivalent JPA

L’équivalent JPA de la suppression du retard à l’initialisation (lazy="false") est fetch=FetchType.EAGER, qui peut être utilisé pour une association ou une collection.

INFO : par défaut dans JPA, les associations @ManyToOne et @OneTone ont par defaut une stratégie Fetchning.EAGER .

RECOMMANDATION : imposez pour vos associations ManyToOne un fetch plan LAZY. Par exemple dans l’entité Formation cela donnerait :

@ManyToOne(fetch = FetchType.LAZY)

private Lieu lieu ;

Partie 3 : stratégie fetch par jointure (fetch="join")

- Sans changer le mapping de participant, modifiez le code du mapping Formation de la façon suivante :

PNG - 17.6 ko
tutoriel-hibernate-fetching-collection-1

- Quelle différence ?

- Relancez la méthode d’ajout d’un participant à une formation....ça passe !

- Analysez le code de la requête générée par hibernate :

texte - 1.5 ko
requete_fetch_join

Quelle différence avec le code SQL généré plus haut lors de la stratégie lazy="false" ?

- En déduire la technique qui permet d’avoir de meilleures performances.

Partie 4 : stratégie fetch par jointure (batch-size="10")

PNG - 7.1 ko
tutoriel-hibernate-fetching-collection-14

- 

PNG - 4.7 ko
tutoriel-hibernate-fetching-collection-15

- 

PNG - 13 ko
tutoriel-hibernate-fetching-collection-12

- 

PNG - 8.6 ko
tutoriel-hibernate-fetching-collection-12bis

- 

PNG - 15.6 ko
tutoriel-hibernate-fetching-collection-12ter

- 

PNG - 13.7 ko
tutoriel-hibernate-fetching-collection-13

- 

texte - 4 ko
requete_n+1_avant_batch_size_infos_participants_formations

- 

texte - 2 ko
requete_n+1_apres_batch_size_collection_infos_participants_formations
PNG - 7.1 ko
tutoriel-hibernate-fetching-collection-14

Partie 5 : stratégie fetch par sous-select (fetch="subselect")

- Modifiez le mapping de Formation ainsi

PNG - 14 ko
tutoriel-hibernate-fetching-collection-16

- Lancez le test unitaire de recherche d’informations participants .

Voic la requête générée.

texte - 1.4 ko
requete_n+1_fetch_subselect_infos_participants_formations

- Expliquez

Quelles différences avec les requêtes ci-dessus ?

Conclusion

Dans ce tutoriel, vous avez touché du doigt la notion de fetching hibernate. Vous avez mis en œuvre une stratégie de fetching entre Formation et participants afin que toute formation chargée soit systématiquement suivie du chargement des participants de la formation. Ce type de paramétrage est particulièrement utile avec des objets détachés.

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