6 votes

Comment cascader @JoinFetch dans EclipseLink ?

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

0voto

cen Points 1808

Après de nombreuses expérimentations, j'en suis arrivé à la conclusion que les annotations ne fonctionnent (à dessein ?) qu'à un niveau de profondeur. Pour un contrôle total, j'ai abandonné les annotations et utilisé des conseils de requête à la place. Suivi de bug .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X