java面试题网

普通会员

115

帖子

83

回复

167

积分

楼主
发表于 2019-09-27 12:15:18 | 查看: 5050| 回复: 0

Hibernate报No Session问题原理及解决方法?

No Session问题原理及解决方法?
Nosession问题是指代理不能被初始化,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已经关闭,报错。


文章来自www.wityx.com,转载请注明出处!原文地址http://www.wityx.com/post/1370_1_1.html


java面试题交流群:327440556

您需要登录后才可以回帖 登录 | 立即注册

java面试题网www.wuliaokankan.cnjava建站系统提供技术支持V2.1 网站地图 © 2016-2018