2010-10-18 21 views
0

J'ai un service web qui est essentiellement un wrapper pour un DAO. J'appelle le service Web/DAO pour demander une collection d'entités. La classe d'entité "parent" contient une collection d'objets d'entité "enfant", c'est-à-dire une relation un-à-plusieurs. L'appel de méthode DAO qui va chercher la collection d'entités « parent » (c.-à-myDAO.findAll()) retourne sans problème, mais le résultat final de l'appel de service Web est cette exception:Hibernate LazyInitializationException: impossible d'initialiser paresseusement une collection de rôle

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: Station.observations, no session or session was closed 

Quelques informations de fond:

J'ai deux entités, Station et Observations. Une entité Station (le "parent") contient une collection d'objets Observations (les "enfants").

La classe DAO pour les entités Station, StationDao a le code suivant pour la méthode appelée, findAll():

private SessionFactory sessionFactory; 

private Class<T> persistentClass; 

public List<T> findAll() 
{ 
    return getCurrentSession().createQuery("from " + persistentClass.getName()).list(); 
} 

Dans ce cas, je ne suis pas intéressé par la collection des enfants (observations) connexes aux parents (stations) étant complètement récupéré avant que la collection des parents soit retournée. Cependant, il semble que l'on tente de récupérer complètement ces objets enfants (observations) avant de renvoyer la collection d'objets parents (station) dans la réponse, et cela échoue parce que la session d'origine n'est plus disponible. Est-ce que quelqu'un peut suggérer comment je contournerais cette erreur? Peut-être existe-t-il un moyen de maintenir la session pendant la durée de la demande?

Merci d'avance pour votre aide!

--James

+0

rechercher le modèle "ouvrir la session dans la vue" – KeatsPeeks

+0

Vous pouvez essayer d'aller chercher les observations avec impatience, mais si vous voulez garder le chargement paresseux, vous devez vous assurer que la session est vivante. Je vous suggère de rechercher "Unité de travail" et Transactions. – zoidbeck

+0

Merci pour les commentaires. J'utilise l'approche suggérée ici: http://community.jboss.org/wiki/OpenSessioninView, mais malheureusement, quand j'entre dans le code de filtre pour obtenir la session en cours, je reçois une erreur me disant "No Hibernate Session bound to thread" . Mes classes DAO sont annotées avec @Transactional et j'ai défini le dans mon contexte d'application Spring sur le gestionnaire de transactions Hibernate. Quelqu'un peut-il suggérer quoi d'autre que je devrais considérer comme une cause possible de mon erreur? –

Répondre

0

Je situation était quand « pas initialiser paresseusement une collection de rôle » a été causée par l'utilisation d'objets persistants après avoir appelé

HibernateTemplate.clear() 

Même si la session était encore actif, les objets anciens ne l'étaient pas. Une façon possible de résoudre le problème était de récupérer les objets de la session.