首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >即使使用OpenEntityManagerInViewFilter,也可以使用LazyInitializationException

即使使用OpenEntityManagerInViewFilter,也可以使用LazyInitializationException
EN

Stack Overflow用户
提问于 2012-03-07 16:18:02
回答 2查看 3.7K关注 0票数 1

我正在尝试使用OpenEntityManageInViewFilter,但我一直在使用LazyInitializationException。当EntityManager初始化两次时,人们也遇到了类似的问题--但这似乎不是我的情况。在异常日志中,我可以看到筛选器正在正确触发。

web.xml:

代码语言:javascript
运行
复制
<web-app version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://java.sun.com/xml/ns/j2ee
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <servlet>
        <servlet-name>web-application</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>web-application</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/web-application-servlet.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <filter>
        <filter-name>openEntityManageInViewFilter</filter-name>
        <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>openEntityManageInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

web-application-servlet.xml

代码语言:javascript
运行
复制
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.1.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

    <import resource="classpath:applicationContext.xml"/>
    <context:property-placeholder location="classpath:application.properties"/>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="viewNames" value="*" />
        <property name="cache" value="false"/>
        <property name="prefix" value=""/>
        <property name="suffix" value=".ftl"/>
        <property name="exposeSpringMacroHelpers" value="false"/>
    </bean>

    <bean id="handlerAdapter" autowire="byType" class="org.maite.controller.router.HandlerAdapter" />
    <bean id="handlerMapping" autowire="byType" class="org.maite.controller.router.HandlerMapping" />
</beans>

applicationContext.xml

代码语言:javascript
运行
复制
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.1.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">


    <tx:annotation-driven />
    <context:annotation-config/>
    <context:spring-configured/>

    <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="persistenceUnit"/>
    </bean>

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
</beans>

还有一个异常(您可以看到OpenEntityManagerInView是堆栈跟踪的一部分):

代码语言:javascript
运行
复制
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: org.goout.model.Event.schedule, no session or session was closed
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:147)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
root cause

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: org.goout.model.Event.schedule, no session or session was closed
    org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:393)
    org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:385)
    org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:378)
    org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:112)
    org.hibernate.collection.internal.PersistentSet.toArray(PersistentSet.java:188)
    java.util.ArrayList.<init>(ArrayList.java:151)
    freemarker.template.SimpleSequence.<init>(SimpleSequence.java:162)
    freemarker.template.DefaultObjectWrapper.wrap(DefaultObjectWrapper.java:117)
    freemarker.template.WrappingTemplateModel.wrap(WrappingTemplateModel.java:134)
    freemarker.template.SimpleHash.get(SimpleHash.java:224)
    freemarker.core.Dot._getAsTemplateModel(Dot.java:76)
    freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
    freemarker.core.IteratorBlock.accept(IteratorBlock.java:94)
    freemarker.core.Environment.visit(Environment.java:221)
    freemarker.core.MixedContent.accept(MixedContent.java:92)
    freemarker.core.Environment.visit(Environment.java:221)
    freemarker.core.Environment.visit(Environment.java:310)
    freemarker.core.BlockAssignment.accept(BlockAssignment.java:83)
    freemarker.core.Environment.visit(Environment.java:221)
    freemarker.core.MixedContent.accept(MixedContent.java:92)
    freemarker.core.Environment.visit(Environment.java:221)
    freemarker.core.Environment.process(Environment.java:199)
    freemarker.template.Template.process(Template.java:237)
    org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:366)
    org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:283)
    org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:233)
    org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:167)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
    org.maite.DispatcherServlet.doService(DispatcherServlet.java:38)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:147)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-15 01:15:02

您遇到了与this question中描述的问题相同的问题,这意味着您有两个EntityManager beans这导致了混乱。

基本上,您需要删除

代码语言:javascript
运行
复制
<import resource="classpath:applicationContext.xml"/>

web-application-context.ml中,对beans进行分区,使web层beans和应用程序beans位于单独的上下文文件中,并确保您的组件扫描每个beans时都会选取正确的beans。这可能需要将类移动到不同的包中,如果没有更多关于项目结构的信息,很难给出建议。

最后,从web.xml引用这两个上下文

票数 3
EN

Stack Overflow用户

发布于 2012-03-14 02:28:00

您能否提供您的DAO类无法初始化另一个DAO类的集合?

尝试将这些参数放入web.xml in过滤器中。

代码语言:javascript
运行
复制
<init-param>
        <param-name>entityManagerFactoryBeanName</param-name>
        <param-value>entityManagerFactory</param-value>
</init-param>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9597918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档