我目前正在遇到一个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()
是一种检索List
个故事的bean方法。然后第二个ui:repeat
应该采用每个标记并显示它的内容。默认情况下,所有提取都是惰性的,以避免加载超过必要的对象。
我仍然对此感到模糊,但据我所知,这可能是因为EntityManager
在请求期间关闭(退出@Transactional
云)或Collection
是被访问。
OpenEntityManagerInViewFilter
已被添加到项目中,但我不确定它是否正确地完成了它的工作。欢迎提出任何测试建议。
由于我认为Collection
是问题所在,我想知道什么是一个好的解决方案。我应该使用fetch join
修改DAO方法吗?或者我应该使用<f:view beforePhaseListener=...>
来触发bean中的方法并从数据库中获取一些新的Tag对象?
编辑:对于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 -->
罗马:
的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"/>
答案 0 :(得分:1)
您的实体经理工厂的名称是什么?
来自OpenEntityManagerInView docs:
在Spring的根Web应用程序上下文中查找EntityManagerFactory。支持web.xml中的“entityManagerFactoryBeanName”过滤器init-param;默认的bean名称是“entityManagerFactory”。
如果您指定的名称与“entityManagerFactory”不同,则过滤器不会看到您的工厂。