2010-03-05 12 views
0

Je rencontre actuellement un LazyInitException avec une page contenant du code comme le suivant:ui: répéter dans un ui: répétition et LazyInitException

<h:form> 
<ui:repeat value="#{searchBean.storiesByTag}" var="iStory"> 
<ui:repeat value="{iStory.tags}"var="iTag">  
<!-- Lazy init exception here --> 
#{iTag.content} 
</ui:repeat> 
</ui:repeat> 
</h:form> 

storiesByTag() est une méthode de haricot qui récupère un List d'histoires. Le deuxième ui:repeat est censé prendre chaque étiquette et afficher son contenu. Toutes les récupérations sont paresseuses par défaut pour éviter de charger plus d'objets que nécessaire.

Je suis encore un peu flou à ce sujet mais, d'après ce que je comprends, cela peut se produire parce qu'un EntityManager est fermé (sortie de @Transactional nuage) lors d'une demande ou d'un Collection est accédée. Le OpenEntityManagerInViewFilter du printemps a été ajouté au projet mais je ne suis pas sûr qu'il fasse correctement son travail. Toutes les suggestions pour tester ceci sont les bienvenues.

Puisque je suppose que le Collection est le problème ici, je voudrais savoir ce qui serait une bonne solution. Dois-je modifier une méthode DAO avec un fetch join? Ou devrais-je prendre la route hacky en utilisant <f:view beforePhaseListener=...> pour déclencher une méthode à l'intérieur d'un bean et obtenir de nouveaux objets Tag à partir de la base de données?

Edit: Pour Bozho:

web.xml:

<!-- Open EM in View Filter --> 

<filter> 
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> 
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> 
</filter> 

<filter-mapping> 
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

<!-- End --> 

Pour Roman:

applicationContext.xml:

<!-- Transaction manager for a single JPA EntityManagerFactory (alternative to JTA) --> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" 
     p:entityManagerFactory-ref="entityManagerFactory"/> 
+1

Comment votre 'OpenEntityManagerInView' est-il configuré? Faites-vous une redirection ou une redirection vers la vue? – Bozho

+0

OpenEntityManagerInView est défini comme un filtre dans web.xml (voir ci-dessus). La redirection est utilisée. –

Répondre

1

Quel est le nom de votre usine de gestionnaire d'entité?

De OpenEntityManagerInView docs:

Attend le EntityManagerFactory dans le contexte de l'application Web racine de printemps. Prend en charge un filtre "entityManagerFactoryBeanName" init-param dans web.xml; le nom de bean par défaut est "entityManagerFactory".

Si vous avez spécifié un nom différent de "entityManagerFactory", le filtre ne voit pas votre fabrique.

+0

C'est la norme "entityManagerFactory" (voir ci-dessus). Un peu utile d'infos si :) –