Hibernate - l'échec de l'paresseusement initialiser - pas de session ou la session a été fermée
j'ai trouvé bizarre état de mon hibernation programme. Voici mon code
public Set<AnotherClass> getAnotherClassSetsFromSomeClass() {
Session session = HIbernateUtil.getSessionFactory().openSession();
Transaction trans = session.beginTransaction();
SomeClass sc = (SomeClass)session.get(SomeClass.class,"classId");
trans.commit();
session.close;
return sc.getAnotherClassSet();
}
Ce code en regardant bien, si je le lance sur la Console Java.
Si je suis a utilisé une web app (JSF),j'ai eu cette erreur
échoué paresseusement initialiser - pas de session ou la session a été fermée
Il a "Un à Plusieurs" de la Relation (Un SomeClass a Beaucoup de AnotherClass)
Le message de l'exception souligné retour sc.getAnotherClassSet()
comme un pointeur null. Je suis sured que j'ai données dans ma base de données.
Ainsi que j'ai découvert que si j'ajoute System.out.println(sc.getAnotherClassSet())
avant de return sc.getAnotherClassSet()
mon code fonctionne bien.
Une idée de ce qui s'est passé ? Merci.
OriginalL'auteur Aldo Suwandi | 2013-08-07
Vous devez vous connecter pour publier un commentaire.
Probablement, votre
@OneToMany
association est mappée avecfetchType="lazy"
(peut-être par défaut). Cela signifie que l'association, dans votre casAnotherClassSet
, n'est pas chargé lorsque vous chargez l'entitéSomeClass
. Il est chargé uniquement lorsque vous essayez d'accéder, à l'aide degetAnotherClassSet()
.Cependant, dans votre exemple, cette méthode (
getAnotherClassSet()
) est appelée sur lereturn
de tresorerie, après la session a été fermée.Pour résoudre ce problème, vous pouvez essayer d'invoquer
getAnotherClassSet()
avant la clôture de la session, il suffit de charger leAnotherClassSet
association.Oui, le chargement de la
AnotherClassSet
association (deSomeClass
) est ce que j'ai essayé de le suggérer, dans le dernier paragraphe de ma réponse 😉OriginalL'auteur Crferreira
Parce que, vous utilisez
lazy initialization
(qui est le paramètre par défaut). Danslazy initialization
, chaque champ collection est récupérée sur demande seulement. Vous devez spécifier l'initialisation commeeager
, pour vos code du travail.Eager initialization
récupère la totalité de l'objet en une seule extraction.Après la fermeture de session, c'est à dire
session.close()
, vous ne pouvez pas récupérer quoi que ce soit.OriginalL'auteur user2550754