I'm currently experiencing a LazyInitException with a page containing code like the following:
<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()
is a bean method that retrieves a List
of stories. The second ui:repeat
is supposed to then take each tag and display it's content. All fetching is lazy by default to avoid loading more objects than is necessary.
I'm still fuzzy on this but, from what I understand, this can happen because an EntityManager
is closed (exit from @Transactional
cloud) during a request or a Collection
is being accessed.
Spring's OpenEntityManagerInViewFilter
from Spring has been added to the project but I'm not sure if it's doing it's job correctly. Any suggestions for testing this are welcome.
Since I assume the Collection
is the problem here I'd like to know what would be a good solution. Should I modify a DAO method with a fetch join
? Or should I take the hacky route by using <f:view beforePhaseListener=...>
to trigger a method inside a bean and get some fresh Tag objects from the database?
Edit: For 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 -->
For 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"/>