2008-12-12 7 views
1

S'il existe plusieurs enregistrements de retour provenant de DB. Il obtiendra le problème de stackoverflow. User est une classe qui a une relation un à plusieurs (à 3 autres classes). Lorsque j'imprime le SQL, j'ai trouvé que le système exécute la même requête plusieurs fois pour obtenir les données de la base de données. Quelqu'un sait-il quel est le problème?De nombreux enregistrements renvoyés provoquent un stackoverflow avec Hibernate

result.addAll(getCurrentSession().createCriteria(User.class) 
    .add(Restrictions.ilike("name", "tom", MatchMode.ANYWHERE)) 
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 
    .list()); 
+0

montrer peut-être vos applications? –

+0

stackoverflow dans stackoverflow +1 – Martin

+0

combien est ** beaucoup ** exactement? Dans tous les cas, il vaut mieux utiliser HQL plutôt que les critères API dans ce cas. Si votre clause where est déterminée lors de l'exécution, les critères api sont utiles sinon HQL est préférable. Vous pouvez enregistrer des requêtes HQL dans les fichiers .hbm ou même utiliser des annotations et elles sont compilées (validées efficacement) lors du chargement initial des liaisons. – arajashe

Répondre

0

Si vous êtes à la recherche pour les utilisateurs avec tom au nom seulement alors il ne devrait pas manquer de mémoire à moins que vous avez beaucoup de% tom% hehe.

Vous pouvez essayer de lui imposer une limite afin qu'elle ne renvoie que des valeurs que vous pouvez gérer à la fois.

Je ne suis pas sûr que quiconque puisse comprendre pourquoi il exécute la même requête sans plus d'informations.

0

Par hasard, utilisez-vous EntityMode.DOM4J? (c'est-à-dire Hibernate -> XML au lieu de Hibernate -> POJO). Les relations imbriquées ne fonctionnent pas sans modification, car le générateur XML est infiniment récursif alors que POJOS le gère correctement.

Je peux élaborer, mais si vous n'utilisez pas DOM4J, alors le problème est autre chose.

0

Il serait utile de savoir exactement quelles requêtes répétées que vous voyez. Comme d'autres l'ont fait remarquer, nous ne faisons que spéculer sans voir vos cartographies. Vous pourriez courir dans la recherche ardente d'Hibernate. C'est là que Hibernate essaie de charger un graphe d'objet entier pour chaque utilisateur (et leurs adresses, téléphones, animaux de compagnie, etc.) correspondant au nom très général contenant la requête 'tom'. Essayez de désactiver par défaut pour le chargement complet des propriétés de l'utilisateur dans vos fichiers de mapping Hibernate ou annotations puis procédez comme suit:

Disons que vous obtenez beaucoup de requêtes répétées à la recherche dans les tables USER_ADDRESS (hibernate property "addresses"), USER_PHONE (property "phones") et USER_PET (property "pets"). Utilisez les appels de critères suivants pour joindre ces attributs dans la requête d'origine et réduire les requêtes répétées. Hibernate sait comment séparer ces colonnes en objets séparés. Vous pouvez également essayer d'ajouter un nombre maximal de résultats renvoyés.

Criteria myUsers = getCurrentSession().createCriteria(User.class); 
myUsers = myUsers.add(Restrictions.ilike("name", "tom", MatchMode.ANYWHERE)); 
myUsers.createCriteria("addresses"); // NEW 
myUsers.createCriteria("phones"); // NEW 
myUsers.createCriteria("pets"); // NEW 
myUsers.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
myUsers.setMaxResults(100); // NEW 
result.addAll(myUsers.list()); 

Vous pouvez en savoir plus dans les sections 15.4-15.6 here

Questions connexes