懒加载的解决方法(全)org.hibernate.LazyInitializationException: could not initialize proxy - no Session

Posted SunnyCx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了懒加载的解决方法(全)org.hibernate.LazyInitializationException: could not initialize proxy - no Session相关的知识,希望对你有一定的参考价值。

如下错误:org.hibernate.LazyInitializationException: could not initialize proxy - no Session

原因是懒加载的问题,因为hibernate的机制是当我们查询一个对象的时候,在默认情况下,返回的只是该对象的普通属性,当用户去使用对象属性的时候,才会向数据库再一次查询,可以这时session已经关闭了,无法对数据库进行查询。

举例:在界面显示雇员所在的部门名称${loginuser.department.name }

解决方法:(强烈推荐方法三和方法四,如果是简单解决可以采用方法一)

方法一:修改对象关系文件,在Department.hbm.xml中做如下修改:

<class name="Department" lazy="false" table="department">

方法二:不推荐。显示初始化,在获取Employee的地方,添加:

Hibernate.initialize(employee.getDept());

方法三:openSessionView,也就是说扩大session的作用范围(这种方法不适合引入spring的时候)

不做处理前,session的作用范围,仅仅在service处调用开始,service处结束。可以使用过滤器,扩大session的作用范围,让他在整个过程都可以起作用

public class MyFilter1 extends HttpServlet implements Filter {
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        Session session = null;
        Transaction transaction = null;
        try {
            session = HibernateUtil.getCurrentSession();
            transaction = session.beginTransaction();
            arg2.doFilter(arg0, arg1);
            // 这是在所有的请求往回返的时候,才会提交
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback();
            }
            throw new RuntimeException(e.getMessage());
        }finally{
            //不能使用常规的关闭
            HibernateUtil.closeCurrentSession();
            
        }
    }
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
}

方法四:

以上是关于懒加载的解决方法(全)org.hibernate.LazyInitializationException: could not initialize proxy - no Session的主要内容,如果未能解决你的问题,请参考以下文章

使用hibernate从一方获取多方信息时报错:org.hibernate.LazyInitializationException: failed to lazily initialize a col

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role

JPA懒加载如何手动加载

ssh框架错误:org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role。

Spring Data JPA使用getOne方法报错:Method threw 'org.hibernate.LazyInitializationException' excepti

org.hibernate.LazyInitializationException: could not initialize proxy [com.angus.entity.ProductCateg