• 总结懒加载的解决方法(全)org.hibernate.LazyInitializationException: could not initialize proxy


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

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

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

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

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

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

    方法二:显示初始化,在从数据库中获取Employee的地方,添加:

    //select预先查询
    Hibernate.initialize(employee.getDepartment());

    总结:方法一和方法二,虽然简单,但是不管后面是否使用Department对象,都会向数据库发出sql语句。我们希望后面需要用Department的时候,才去查数据库,不使用的时候不查数据库。

    方法三:spring专门提供了openSessionView来解决懒加载,也就是说扩大session的作用范围

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

    本质是使用过滤器来管理事务的开始和提交

    在web-xml文件中做如下配置:

    <!-- 配置openSessionView解决懒加载 -->
    <
    filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

    总结:openSeesionView可以有效的解决懒加载问题,并保证需要对象属性时才查询数据库,但是会使得和数据库保持的session时间延长

  • 相关阅读:
    嵌入式实验一:LED灯点亮
    [转] sql中的in与not in,exists与not exists的区别
    订单管理系统基本情况
    solaris系统分区及格式化
    百度超大网盘邀请码,点击可以获得额外的300M哦
    vb设置代理ip
    我看到一种防伪查询系统,叫做西门防伪防伪查询系统,不知道好不好用。
    零碎知识点整理
    初学WCF之消息模式3——双工模式
    HTTP 错误 500.21 Internal Server Error
  • 原文地址:https://www.cnblogs.com/sunnyCx/p/7765366.html
Copyright © 2020-2023  润新知