2010-02-01 3 views
2

Mon application Web Java utilise Hibernate pour effectuer un ORM. Dans certains de mes objets, j'utilise un chargement paresseux pour éviter d'avoir des données jusqu'à ce que j'en ai absolument besoin. Le problème est que je charge l'objet initial dans une session, puis cette session est détruite. Lorsque je tente plus tard de résoudre les collections paresseux chargé dans mon objet que je reçois l'erreur suivante:Chargement différé dans Hibernate

org.hibernate.LazyInitializationException: Échec de l'initialisation paresseusement une collection de rôle: common.model.impl.User.groups, aucune session ou session n'a été fermée

J'ai essayé d'associer une nouvelle session à la collection puis de la résoudre, mais cela donne les mêmes résultats.

Est-ce que quelqu'un sait comment je peux résoudre les collections paresseuses une fois la session originale disparue?

Merci ...

--Steve

+1

Avez-vous cherché dans stackoverflow? la recherche donne beaucoup d'indices – Salandur

+0

En fait, j'ai fait des recherches dans StackOverflow et d'autres endroits. Ce que j'ai trouvé n'a pas semblé donner une réponse qui s'appliquait à mon problème. Si vous avez un message spécifique que je pourrais avoir manqué, postez-le, donc je peux voir si cela aide. – Steve

Répondre

2

Trois options:

  1. appel Hibernate.initialize(..) sur votre collection chaque fois qu'il est sur le point de se déconnecter de la session en cours

  2. déclarent la collection comme FetchType.EAGER

  3. merge(..) votre objet utilisateur retour à la nouvelle session

2

Avant d'accéder aux collections non initialisées ou d'autres procurations, vous devez attacher un objet chargé au préalable à une nouvelle Session avec merge() ou lock(). Je ne sais pas comment vous avez fait cela dans votre cas, mais le fait est que votre User était encore détaché lorsque vous avez essayé de récupérer son groups.

1

Vous avez quelques options, mais le problème principal est que vous devez étendre votre session ou rattacher vos objets à la session.

Pascal a fourni la réponse sur la manière de rattacher des objets à une nouvelle session.

Une autre option consiste à modifier la façon dont vous gérez les sessions. Dans notre application, nous utilisons également Spring, et laissez Spring gérer les sessions d'Hibernate pour nous. Cela fournit une bonne partie de la solution, mais vous devrez quand même réattacher des objets de temps en temps, ce qui n'est qu'une partie de la façon dont vous utilisez Hibernate dans les environnements Web.

Questions connexes