Quote:
Cette contrainte de projet est douteuse, d'autant qu'une tartine de join ou left cause un gros problème sur la quantité de données recue (exemple, le parent X, tous ses enfants et les cours des enfants, çà ne fait que 3 niveau de collection, les données du parent seront présente dans chaque row. Si le parent à 3 enfant et que chaque enfant a 10 cours, les datas du parent apparaitront 30 fois dans le resultat)
Tu estimes donc qu'il est plus judicieux d'avoir un grand nombre de requêtes SQL (ce que fait le chargement tardif) retournant une petite quantité de données plutôt que d'avoir une seule requête SQL contenant plusieurs jointures et retournant un grand nombre de données.
Je ne suis pas tout à fait d'accord sur ce point. Tout d'abord, cela "pompe" sur la base de données et la multiplication des requêtes pourra faire exploser plus rapidement le pool de connexion. Ensuite, le chargement tardif des objets a l'inconvénient de multiplier les allers retours entre la couche applicative java et la couche data de la BD et cela me semble crade dans le principe alors qu'une requête SQL bien faite en JDBC pur permet de déléguer entièrement le traitement des données à la BD dont c'est le rôle après tout.
Comme tu le soulignais, il y a effectivement la désactivation du lazy initialisation qui permet de charger toute la grappe de données mais je n'ai pas toujours besoin de toute cette grappe de données lorsque j'accède à une table. Je perdrais en performance d'un coté ce que je gagne de l'autre...
La notion de 'demi-objet' que tu évoquais précédemment est aussi très contraignante :
Supposons cette grappe d'objets :
Code:
cat1
|----kitten1
''''''''''''''''''''|--------littlekitten1
''''''''''''''''''''|--------littlekitten2
|----kitten2
''''''''''''''''''''|--------littlekitten3
''''''''''''''''''''|--------littlekitten4
Si je veux une requête qui retourne l'élément Cat dont le Littlekitten est 'littlekitten1', je fais en HQL :
select cat from Cat as cat
left join fetch cat.kittens as kittens
left join fetch kittens.littlekittens as littlekitten
where littlekitten.nom='littlekitten1'
Le SQL généré me retourne une seule ligne (concaténation de cat1, little1 et littlekitten1) mais si j'itère sur les champs de l'objet cat1 retourné j'obtient kitten1 et kitten2 littlekitten1, littlekitten2, littlekitten3 et littlekitten4 alors que j'attendais seulement kitten1 et littlekitten1.
Donc ça aussi ça limite l'utilisation des fetch. Je trouve dommage de faire un langage de requétage aussi élaboré que le HQL si la représentation objet ne permet pas de filtrer les collections autrement qu'en faisant session.filter(...)
Je vais tenter de faire la recherche que je souhaite en SQL natif via session.createSQLQuery(...) en espérant que cela résoudra le problème d'initialisation.
Et si ça ne me convient toujours pas, je passerais à JDBC pour cette requête spéciale.
Merci pour tes précieux conseils :-)