我目前遇到了 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
from Spring 已添加到项目中,但我不确定它是否正确完成工作。欢迎提出任何测试建议。
因为我假设 Collection
是这里的问题我想知道什么是一个好的解决方案。我应该用 fetch join
修改 DAO 方法吗? ?或者我应该使用 <f:view beforePhaseListener=...>
采取黑客路线触发 bean 内的方法并从数据库获取一些新的 Tag 对象?
编辑:对于博佐:
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 文档:
Looks up the EntityManagerFactory in Spring's root web application context. Supports a "entityManagerFactoryBeanName" filter init-param in web.xml; the default bean name is "entityManagerFactory".
如果您指定的名称与“entityManagerFactory”不同,则过滤器看不到您的工厂。
关于java - 用户界面 :repeat inside a ui:repeat and LazyInitException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2385858/