J'ai le modèle suivant : La commande a plusieurs éléments et les éléments ont plusieurs autres enfants. C'est un arbre de plusieurs niveaux de profondeur.
J'ai un chargement EAGER sur tous @OneToMany
en même temps que @JoinFetch
et LAZY loading sur tous les @ManyToOne
(pour éviter des requêtes supplémentaires dans le problème N+1).
Conformément à Comment faire une jointure fetch "profonde" en JPQL ? Je peux utiliser plusieurs indications de requête pour charger de manière présumée rapide l'ensemble de l'arbre, mais je préférerais le faire uniquement par le biais d'annotations.
Malheureusement, même avec l'arbre entier annoté de @JoinFetch
Il semble que les jointures ne soient effectuées qu'à un seul niveau de profondeur, ce qui entraîne des requêtes multiples au lieu d'une seule requête pour l'ensemble de l'arbre.
Ce sont les requêtes que je vois être exécutées :
Order - jointure externe gauche sur tous les enfants.
OrderItem - jointure externe gauche sur tous les enfants.
...etc pour tous les niveaux.
Je peux voir @JoinFetch
fonctionne mais il ne fonctionne qu'à un seul niveau de profondeur. Ce que j'aimerais obtenir, c'est une seule requête pour charger l'ensemble de l'arbre.
Bien que ce chargement profond à un niveau m'ait permis de multiplier par deux la vitesse des appels, il n'est toujours pas optimal pour le chargement d'un grand nombre d'entités à la fois, car chaque entité implique plus de 5 requêtes supplémentaires.
Existe-t-il un moyen de charger l'arbre entier avec les annotations uniquement ou dois-je définir manuellement plusieurs indices de requête pour y parvenir ?
Réponse de James Sutherland aquí ne semble pas être vrai (à propos du travail récursif).