07
2020
11

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

No session问题报错如下:

 1558060446@16d84cb222aa942fb7d6156491dc79b1.png


 

根据字面上的意思,是指代理不能被初始化,session已经关闭。

 

● No session问题产生的原因:

 

当执行Session的load()方法时,Hibernate不会立即执行查询所查询对象关联的对象(在此我们统称被关联的对象类为A类),仅仅返回A类的代理类的实例,这个代理类具由以下特征:

 

由Hibernate在运行时动态生成,它扩展了A类,因此它继承了A类的所有属性和方法,但它的实现对于应用程序是透明的。

 

当Hibernate创建A类代理类实例时,仅仅初始化了它的OID属性,其他属性都为null,因此这个代理类实例占用的内存很少。

 

当应用程序第一次访问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已经关闭,报错。

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。