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

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

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

 Comprendre les stratégies de fetching et d’optimisations

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

tutoriel-hibernate-fetching-collection-0

 Test unitaire de la méthode création Participant

tutoriel-hibernate-fetching-collection-3

Résultat :

tutoriel-hibernate-fetching-collection-0ter

Entité Formation

 Analysez le mapping de la classe Formation

tutoriel-hibernate-fetching-collection-1bis

 Test unitaire de la méthode création Formation

tutoriel-hibernate-fetching-collection-4

Résultat :

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 ?

tutoriel-hibernate-fetching-collection-2

 Test unitaire de la méthode Ajout Participant à Formation

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

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 :

tutoriel-hibernate-fetching-collection-10

 Quelle différence ?

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

tutoriel-hibernate-fetching-collection-11

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

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 :

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 :

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″)

tutoriel-hibernate-fetching-collection-14

 

tutoriel-hibernate-fetching-collection-15

 

tutoriel-hibernate-fetching-collection-12

 

tutoriel-hibernate-fetching-collection-12bis

 

tutoriel-hibernate-fetching-collection-12ter

 

tutoriel-hibernate-fetching-collection-13

 

requete_n+1_avant_batch_size_infos_participants_formations

 

requete_n+1_apres_batch_size_collection_infos_participants_formations

tutoriel-hibernate-fetching-collection-14

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

 Modifiez le mapping de Formation ainsi

tutoriel-hibernate-fetching-collection-16

 Lancez le test unitaire de recherche d’informations participants .

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

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.

2018-01-27T18:12:20+01:00

Contactez nous

241 rue DUGUESCLIN, 69003 Lyon

Web : Objis : spécialiste formation Java