2010-09-23 7 views
4

Dans un scénario avec deux types d'entités, parents et enfants:JPA/mise en veille prolongée grandes collections

Parent - enfants @OneToMany Collection;

La valeur par défaut est d'avoir un chargement paresseux sur la collection d'enfants. Ce modèle fonctionne très bien pour un petit nombre d'enfants, mais si le nombre grandit, cela semble insoutenable. Donc, pour les occasions où je pense que le nombre d'enfants sera très grand, j'ai utilisé des méthodes de service avec pagination (comme "getChildren (Parent parent, int offset, nombre d'int)") à la place.

La question est: est-ce la meilleure façon de gérer des situations comme celle-ci? Ou ai-je manqué quelque chose?

Merci, Piotr

Répondre

7

Ce modèle fonctionne très bien pour un petit nombre d'enfants, mais si le nombre croît très important, cela semble insoutenable. Je dirais que tout dépend de ce que vous voulez faire avec eux, mais dans la plupart des cas, c'est vrai. Donc, pour les occasions où je pense que le nombre d'enfants sera très grand, j'ai utilisé des méthodes de service avec pagination (comme "getChildren (Parent parent, int offset, nombre d'int)") à la place.

Paging est une approche très naturelle si vous avez besoin d'afficher un (potentiellement très) grand nombre de résultats pour la navigation. Les humains le plus souvent ne veulent pas ou n'ont pas besoin de tous les dossiers et ils ne peuvent pas faire face à un grand nombre de résultats de toute façon. Le cas des demandes devant traiter tous les résultats à la fois est évidemment différent, mais l'APP ne peut tout simplement pas leur convenir.

La question est: est-ce la meilleure façon de gérer des situations comme celle-ci? Ou ai-je manqué quelque chose?

OMI, il est certainement beaucoup mieux que nourrir une page de résultats avec toute la collection que vous obtiendrez en appelant parent.getChildren(), et il sauvera des bases de données, réseau, ressources serveur app.

Une autre chose que vous pourriez envisager est de restreindre le nombre maximum de résultats lors d'une recherche. Au lieu de paginer les résultats 10 ((qui va naviguer de toute façon?), Il est courant (du moins selon mon expérience) de demander à l'utilisateur d'effectuer une recherche plus restrictive, c'est-à-dire d'ajouter des critères de recherche. C'est un peu différent de votre question initiale.

+0

Merci, c'est l'assurance dont j'avais besoin. Si vous voulez répondre, quand vous faites votre conception de domaine - avez-vous des collections du propriétaire aux enfants juste pour garder la conception de modèle de domaine "correcte", ou passez-vous et avez des relations seulement des enfants aux parents? –

+0

@Piotr Je ne les aurais pas eu pour l'exactitude du modèle de domaine seulement. –

0

Avez-vous besoin de tous les enfants? Ou allez-vous simplement sélectionner quelques-uns de la liste entière retournée? Si oui, interrogez directement les entités enfants pour ce que vous voulez. Si vous en avez besoin, regardez dans la pagination.

5

Faire comme vous le faites (c'est-à-dire, charger les enfants par une requête séparée) est probablement la meilleure solution.

Autre chose à considérer: Hibernate a l'option de "extra-lazy" loading pour les collections. Avec un chargement paresseux régulier, la collection entière est chargée lorsque vous y accédez pour la première fois; mais en mode extra-paresseux, Hibernate peut charger la collection de quelques éléments à la fois, au besoin.Je ne pense pas qu'il existe un moyen d'accéder à cette fonctionnalité, sauf si vous utilisez l'API Hibernate directement - JPA ne connaît que "paresseux" et "avide".

Questions connexes