首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate org.hibernate.LazyInitializationException

Hibernate org.hibernate.LazyInitializationException
EN

Stack Overflow用户
提问于 2011-12-08 18:59:29
回答 4查看 3.9K关注 0票数 1

我正在使用带有jsp-servlet的hibernate。当我试图访问子元素属性时,我得到了以下异常:

代码语言:javascript
运行
复制
 Servlet.service() for servlet jsp threw exception: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.ecomm.ultimatesms.messaging.persistence.pojos.Mno.startnumbers, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380) [:3.3.2.GA]
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372) [:3.3.2.GA]
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365) [:3.3.2.GA]
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108) [:3.3.2.GA]

这是我的hibernate映射文件。我正在使用hibernate-mapping default-lazy="false"

代码语言:javascript
运行
复制
<hibernate-mapping default-lazy="false">
<class name="com.ecomm.ultimatesms.messaging.persistence.pojos.Mno" table="mno" schema="public">

    <id name="pkmnoid" type="long">
        <column name="pkmnoid" />
     <generator class="sequence">
            <param name="sequence">mno_pkmnoid_seq1</param>
        </generator>
    </id>

    <property name="name" type="string">
        <column name="name" length="45" />
    </property>

    <set name="startnumbers" table="startnumber" inverse="false" lazy="true" fetch="select" cascade="delete">
        <key>
            <column name="fkmnoid" />
        </key>
        <one-to-many class="com.ecomm.ultimatesms.messaging.persistence.pojos.Startnumber" />
    </set>
</class>
</hibernate-mapping>
EN

回答 4

Stack Overflow用户

发布于 2011-12-08 20:50:53

我不认为你需要将所有的连接设置为渴望。

或者,您需要在视图模式中使用Open Session。

你可以在这里了解更多:

http://community.jboss.org/wiki/OpenSessionInView

票数 2
EN

Stack Overflow用户

发布于 2011-12-08 19:09:10

允许您仍然打开一个打开的会话/实体管理器的一个很好的方法是,让一个过滤器在请求开始时注入EntityManager,然后在它执行后关闭它,这样您就再也不会关心它了。瞧一瞧

代码语言:javascript
运行
复制
package com.renatogama.infra.filters;

import java.io.IOException;

import javax.persistence.EntityManager;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter(urlPatterns = "/*")
public class EntityManagerFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        EntityManager em = new JPAUtil().getEntityManager();
        try {
            em.getTransaction().begin();
            request.setAttribute("em", em);
            chain.doFilter(request, response);
            em.getTransaction().commit();
        } catch (Exception e) {
            em.getTransaction().rollback();
            throw new ServletException(e);
        } finally {
            em.close();
        }
    }

    @Override
    public void destroy() {}

    @Override
    public void init(FilterConfig arg0) throws ServletException {}
}
票数 1
EN

Stack Overflow用户

发布于 2011-12-08 19:04:13

由于您已经设置了lazy=true,因此必须在关闭hibernate会话之前初始化集合。这是一篇可能对你有帮助的文章,http://community.jboss.org/wiki/LazyInitializationExceptionovercome

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8429887

复制
相关文章

相似问题

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