Le problĂšme N 1 en JPA/Hibernate :
Vous chargez N entités, puis vous accédez à une relation lazy (
@OneToMany,
@ManyToOne).
Hibernate dĂ©clenche 1 requĂȘte pour la liste, puis 1 requĂȘte par entitĂ© pour charger la relation.
100 commandes avec leurs lignes â 101 requĂȘtes SQL au lieu d'1 seule.
3 façons de l'éviter, de la plus utilisée à la moins utilisée :
â @EntityGraph sur la mĂ©thode du repository :
Déclaratif, lisible, directement sur le Spring Data Repository. Solution par défaut aujourd'hui.
@EntityGraph(attributePaths = "items")
â JOIN FETCH en JPQL :
RequĂȘte explicite qui charge la relation en un seul SELECT avec JOIN. Utile dans les requĂȘtes custom.
SELECT o FROM Order o JOIN FETCH o.items
â Projection JPA :
Si vous n'avez pas besoin des entités complÚtes, sélectionnez directement les champs utiles via un DTO ou une interface de projection. Plus performant, moins de mémoire, mais demande plus de code.
Comment le détecter :
â spring.jpa.show-sql=true en dĂ©veloppement pour voir les requĂȘtes gĂ©nĂ©rĂ©es
â Hibernate Statistics pour compter les requĂȘtes par transaction
RĂšgle simple :
Si le nombre de requĂȘtes dĂ©pend de la taille du rĂ©sultat, c'est un problĂšme N 1.
#Java #SpringBoot #Hibernate #Performance