2010-07-24 7 views
0

Lorsque vous essayez d'obtenir des éléments de db, je suis arrivé cette erreur:Hibernate JPA, Spring MVC et LazyInitializationException

13:00:13.876 [[email protected]] ERROR o.h.LazyInitializationException - failed to lazily initialize a collection of role: bo.myobj, no session or session was closed 
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: de.myob.linkedstuff, no session or session was closed 

Je comprends que, avec le passage à hâte au lieu de chargement paresseux résout ce problème, par exemple

@OneToMany(mappedBy = "myobj", cascade = CascadeType.ALL, fetch=FetchType.EAGER) 

et je comprends également que le chargement hâtif est découragé. Quelle est la meilleure pratique pour faire face à ce problème?

Répondre

2

une meilleure séparation entre la persistance et d'autres couches. Assurez-vous que les objets produits par la couche de persistance n'incluent aucune référence à Hibernate.

L'article Hibernate, Get Out of My POJO! peut être utile.

+0

Merci pour le conseil, je suppose que c'est la bonne stratégie.Mais, j'ai été confronté à tant de problèmes depuis que j'ai commencé à utiliser un ORM que je me demande s'il y est un benifit en utilisant * any * ORM ... désolé, juste * avait * à mentionner que :-( –

+0

@erlord: N'hésitez pas à ne pas utiliser un ORM (du moins pas un avec un contexte de persistance défini) alors :) Et bien la chance! –

5

Je suis assez sûr que cela se produit quand il n'y a pas de transaction active.

Lire la pièce de référence du printemps sur les Declarative Transaction Management

Habituellement, cela se résume à votre méthode de service ou classe besoin l'annotation @Transactional si vous utilisez des annotations ou configuration XML autrement propre de <tx:advice>.

+0

Désolé, j'ai vérifié tous les haricots - @Transactional est présent dans toutes les méthodes de DAO ... mon xml semble bien trop –

+0

Merci pour downvoting. Ce que je voulais dire, c'est: êtes-vous toujours dans la portée transactionnelle, lorsque vous accédez à la collection? Parce que ça ne se passe probablement pas dans une méthode dao, n'est-ce pas? –

+1

Cela ne mérite pas un IMO downvote. +1 pour contrebalancer. –

3

Ceci est un problème commun, généralement causée en rendant la vue après la mise en veille prolongée Session est fermé. Une solution courante consiste à utiliser le modèle Open Session In View, qui gardera la session de mise en veille prolongée ouvert pendant toute la durée de la demande Web.

Spring est livré avec un filter qui implémente ce modèle. Pour l'activer pour tous les fichiers JSP dans votre application, par exemple, ajouter quelque chose comme ceci à votre web.xml:

<filter> 
    <filter-name>osivFilter</filter-name> 
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>osivFilter</filter-name> 
    <url-pattern>*.jsp</url-pattern> 
</filter-mapping> 
+0

J'ai inséré les lignes, cependant, le laziiniterror persiste :-( –

Questions connexes