ui:在ui中重复:repeat和LazyInitException

时间:2010-03-05 10:03:13

标签: java exception jsf transactional

我目前正在遇到一个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的Spring 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"/>

1 个答案:

答案 0 :(得分:1)

您的实体经理工厂的名称是什么?

来自OpenEntityManagerInView docs:

  

在Spring的根Web应用程序上下文中查找EntityManagerFactory。支持web.xml中的“entityManagerFactoryBeanName”过滤器init-param;默认的bean名称是“entityManagerFactory”。

如果您指定的名称与“entityManagerFactory”不同,则过滤器不会看到您的工厂。