JPA / Hibernate Avancé (3 jours)

JPA/Hibernate Avancé

Objectifs

Cette formation est spécialement conçue pour les développeurs utilisant déjà JPA, et qui veulent passer au niveau supérieur. Nous étudierons en détail tous les concepts avancés de JPA et Hibernate, et nous en verrons les écueils et les bonnes pratiques à suivre. Cette formation dure 3 jours, intensifs, et est destinée à un public plutôt expérimenté. Elle comporte 50% de théorie (près de 300 slides) et 50% de pratique (12 TPs).

Contenu de la formation

Introduction : les concepts de base
  • Les ORMs et la modélisation objet de données
  • Survol des fonctionnalités
  • Architecture de JPA
  • Hibernate
  • Les nouveautés de JPA 2
Mise en place d'un environnement de travail
  • Gestion d'une ou de plusieurs datasources : JNDI ou configuration embarquée dans l'application ?
  • CDI ou Spring ? Différences, avantages et inconvénients
  • Configuration d'un projet et démarrage de l'application
  • TP1 : Configurer son environnement de travail, son implémentation JPA, sa base de données
Tester son code JPA
  • Tests unitaires contre tests d'intégration
  • Les différentes méthodes pour faire des tests d'intégration : exemples de Spring et d'Arquillian
  • TP2 : Tester l'application avec Arquillian
Au cœur de JPA
  • L'architecture en détail
  • Génération de proxies
  • Niveaux de Cache L1 et L2
  • Cycle de vie et événements
  • Le locking
Modélisation et architecture d'une application JPA
  • Consignes générales sur la modélisation des entités
  • Approche top down ou bottom up ?
  • Bonnes pratiques d'implémentation des entités en Java
  • Cas particulier des indexes
  • Bonnes pratiques d'utilisation des entités dans les différentes couches (usage de DTO ou pas)
  • Utilité de détacher les entités
  • Gérer du transactionnel dans une conception en couche : Application/Services/DAO
La gestion des clefs primaires
  • Clef métier contre clef technique
  • Stratégies de génération de clef technique
  • Générateur classique et amélioré de séquences
  • Générateur d'UUID
  • TP3 : Les clefs primaires
La gestion des collections
  • Les différents types de collection
  • Avantages et inconvénients de chaque type
  • Utilisation des equals et hashcode : les bugs classiques
  • Navigation bi-directionnelle : est-ce une bonne idée ?
  • Le cascading (delete orphan, etc)
  • Comment gérer le "côté inverse" d'une collection
  • Les filtres
  • Le fetch
  • Batch et n+1
  • TP4 : Les collections
Utiliser Bean Validation pour renforcer les entités JPA
  • Présentation de Bean Validation
  • Créer ses propres annotations
  • Les groupes de validation
  • TP5 : Bean Validation
Les transactions
  • Le rôle des transactions
  • Les transactions en EJB, CDI et Spring
  • Les niveaux d'isolation
  • Les transactions read-only
  • La propagation des transactions
  • Les transactions XA
  • TP6 : Les transactions
Le lazy loading
  • Fonctionnement et utilité
  • Comment gérer les LazyLoadingExceptions
  • Impacts sur la performance
  • Le OpenSessionInView est-il une mauvaise pratique ?
  • Le persistence context étendu
  • TP7 : Le lazy loading
L'héritage
  • Modélisation de l'héritage
  • Impact de la modélisation sur les performances
Les requêtes
  • JPQL : introduction
  • Dynamic queries et Named queries
  • Exemples de requêtes simples
  • Les constructeurs
  • Les jointures
  • Forcer le Fetch
  • Les fonctions
  • Les fonctions spécifiques à JPA
  • La pagination
  • Cas d'utilisations pour l'API Criteria
  • CriteriaBuilder et CriteriaQuery
  • Les join() et les fetch()
  • Le metamodel JPA
  • Exemples de requêtes classiques
  • TP8 : JPQL
  • TP9 : L'API Criteria
Le cache de niveau 2
  • Le Master Data Management
  • Comment fonctionne le cache L2
  • Configuration et utilisation
  • Durée de vie et rafraîchissement des entités
  • Monitoring
  • Les différentes solutions disponibles
  • Focus sur Ehcache
  • Focus sur Infinispan
  • Le cache de requêtes
  • TP10 : Le cache de niveau 2
Utiliser JPA en production : l'outillage
  • Utilisation d'un driver proxy JDBC
  • Quel driver choisir ?
  • Mise en place des logs
  • Utilisation de l'analyseur de requêtes
  • Utilisation d'un sniffer réseau
  • Monitorer Hibernate avec JMX
  • TP11: Outillage en production
Utiliser JDBC avec JPA
  • Le problème du flush()
  • Le problème du cache de requêtes
  • JPA Native Queries et Hibernate Native Queries
Les batchs
  • Pourquoi faire des batchs ?
  • Problèmes courants avec les batchs
  • Traitements par lots
  • Trucs et astuces de performance
  • Spring Batch
  • TP12 : les batchs
Projets complémentaires à Hibernate
  • Hibernate Envers
  • Hibernate Search
Erreurs et questions classiques
  • Les entités immutables
  • Pourquoi utiliser persist() au lieu de merge() ?
  • Pourquoi utiliser getReference() ?

Support de formation