黑马程序员技术交流社区

标题: No Session 问题原理及解决方法? [打印本页]

作者: 2048    时间: 2018-6-25 09:51
标题: No Session 问题原理及解决方法?
Nosession 问题产生的原因:
当执行 Session 的 load()方法时,Hibernate 不会立即执行查询所查询对象关联的对象(在此我们统称被关联的对象类为 A 类),仅仅返回 A 类的代理类的实例,这个代理类具由以下特征:
(1)由 Hibernate 在运行时动态生成,它扩展了 A 类,因此它继承了 A 类的所有属性和方法,但它的实现对于应用程序是透明的。
(2)当 Hibernate 创建 A 类代理类实例时,仅仅初始化了它的 OID 属性,其他属性都为 null,因此这个代理类实例占用的内存很少。
(3)当应用程序第一次访问 A 代理类实例时(例如调用 a..getXXX()或 a.setXXX()方法),Hibernate 会初始化代理类实例,在初始化过程中执行 select 语句,真正从数据库中加载 A 对象的所有数据。但有个例外,那就是当应用程序访问 A 代理类实例的 getId()方法时,Hibernate 不会初始化代理类实例,因为在创建代理类实例时 OID 就存在了,不必到数据库中去查询。
提示:Hibernate 采用 CGLIB 工具来生成持久化类的代理类。CGLIB 是一个功能强大的 Java 字节码生成工具,它能够在程序运行时动态生成扩展 Java 类或者实现 Java 接口的代理类。
因为 Hibernate 中如果采用 load 加载的话(默认的是延迟加载),也就是 lazy=true 操作,因此,当调用完 load后,session 即可关闭。因为我们的 session 只是放置到了 Dao 层,表现层根本获取不到,所以在表现层调用的时候,session 已经关闭,报错。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2