2010-04-14 7 views
0

Exécution de KODO 4.2 et génération d'un problème de requêtes inefficaces générées par KODO. Cela se produit lors de l'extraction d'un objet qui contient une collection dans laquelle cette collection a une relation bidirectionnelle avec le premier objet.KODO: comment configurer récupérer le plan pour les relations bidirectionnelles?

Class Classroom 
{ 
    List<Student> _students; 
} 

Class Student 
{ 
    Classroom _classroom; 
} 

Si nous créons un plan de récupération à obtenir une liste des salles de cours et de leurs étudiants correspondants en mettant en place le plan suivant aller chercher:

fetchPlan.addField (Classroom.class, » _ étudiants »); Cela entraînera deux requêtes (obtenir les salles de classe et ensuite obtenir tous les élèves qui sont dans ces salles de classe), ce qui est ce que nous attendons. Cependant, si nous incluons la référence dans la classe dans notre plan d'extraction pour que le champ _classroom soit rempli en faisant fetchPlan.addField (Student.class, "_classroom"), ceci se traduira par un nombre X de requêtes supplémentaires où X est le nombre d'élèves dans chaque classe.

Quelqu'un peut-il expliquer comment résoudre ce problème? KODO possède déjà les objets Classroom d'origine au moment où il exécute les requêtes pour récupérer les objets Classroom et les définit dans le champ _classroom de chaque objet Student. Je m'attendrais donc à ce que KODO mette simplement ces objets dans le champ _classroom sur chaque objet Student en conséquence et ne retourne pas à la base de données.

Encore une fois, la documentation fait cruellement défaut, mais d'après ce que j'ai lu, elle devrait pouvoir le faire plus efficacement.

Remarque-- EAGER_FETCH.PARALLEL est activé et j'ai essayé cela avec la mise en cache (requêtes et caches de données) activé et désactivé et il n'y a aucune différence dans les requêtes résultantes.

Répondre

0

Travaillé avec Oracle Support sur this-- ceci est un défaut dans Kodo 4.2 (la dernière version). La solution consiste à supprimer COMPLETELY de l'attribut default-fetch-group (ne le définissez pas sur true ou false) à partir du fichier de métadonnées jdo pour les champs qui se trouvent du côté un-à-un de la relation bidirectionnelle. Ainsi, dans l'exemple ci-dessus, vous devez supprimer l'attribut default-fetch-group pour le champ Student._classroom.

Questions connexes