我目前遇到 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
关闭(从云中退出)或正在访问 a。@Transactional
Collection
Spring 的 Spring's OpenEntityManagerInViewFilter
from Spring 已添加到项目中,但我不确定它是否正确地完成了它的工作。欢迎任何有关测试的建议。
因为我认为这Collection
是这里的问题,所以我想知道什么是一个好的解决方案。我应该用 修改 DAO 方法fetch join
吗?<f:view beforePhaseListener=...>
或者我应该通过使用来触发 bean 中的方法并从数据库中获取一些新的 Tag 对象来采取 hacky 路线?
编辑:对于 Bozho:
网页.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 -->
对于罗马:
应用上下文.xml:
<!-- Transaction manager for a single JPA EntityManagerFactory (alternative to JTA) -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory"/>