【发布时间】:2010-03-05 10:03:13
【问题描述】:
我目前遇到 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。
Spring 的 OpenEntityManagerInViewFilter 已添加到项目中,但我不确定它是否正确地完成了工作。欢迎提出任何测试建议。
因为我认为Collection 是这里的问题,所以我想知道什么是好的解决方案。我应该用fetch join 修改DAO 方法吗?或者我应该通过使用<f:view beforePhaseListener=...> 来触发 bean 中的方法并从数据库中获取一些新的 Tag 对象来采取 hacky 路线?
编辑:对于 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"/>
【问题讨论】:
-
您的
OpenEntityManagerInView是如何配置的?您是在重定向还是转发到视图? -
OpenEntityManagerInView 被定义为 web.xml 中的过滤器(见上文)。正在使用重定向。
标签: java exception jsf transactional