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"/>
Comment votre 'OpenEntityManagerInView' est-il configuré? Faites-vous une redirection ou une redirection vers la vue? – Bozho
OpenEntityManagerInView est défini comme un filtre dans web.xml (voir ci-dessus). La redirection est utilisée. –