`

LazyInitializationException: could not initialize proxy - no Session

阅读更多

OK,这个问题可以解决,先让我描述下:

SSH结合开发
这是一个登陆模块
我在login的action里面封装了一个菜单list 存入session

然后跳转到主页,主页里根据这个用户的菜单list生产菜单
不过模块是menu的action

这时候就跑错了!
javax.servlet.ServletException: org.hibernate.LazyInitializationException: could not initialize proxy - no Session

在网上知道是什么延迟 什么的。

但是按照解决办法来都行不通。

后来我解决的方法很简单,也没有用到lazy什么的,因为我的表都是没有关联的。我是在取值的时候,之前用的是load,后来改成了get。

因为lazy默认是ture,load 方法是延迟加载的,而用get后,就不是延迟加载,等价于lazy=false。所以问题解决。以下是get load的说明:

.延迟加载    
    
  延迟加载的好处在于节省资源,只在被调用的时候才对查询,避免了即时加载遇上大量数据时占用大量资源的情况。
  延迟加载有两种:  

  a. get()和load()  使用方法见下面9
  这两个方法都用于查询已知只有一条记录的情况,但是load()方法是有延迟加载的。

  b. orm类的延迟加载
  每一个表对应的.hbm.xml文件中,都可以在<class />标签内加一个lasy="true || false"这样的开关,用于控制此orm类是否启用延迟加载。
  lazy="true" 这个延迟加载的开关,默认认是ture,不建议关闭。
  
  那么比较一下上面两个延迟加载的区别: 
  load()仅用于只有一条记录的情况下使用延迟加载,使用get()则不延迟。 
  .hbm.xml文件中lazy所控制的,是整个orm类。  
  也就是说,如果把orm类的延迟加载设为false,那么即使我们再使用load() ,同样也不能延迟加载。
get()   &    load()方法的区别: 
  
相同点:
都可以从数据库中查询指定标识的对象。

不同点:
      load()方法查询的对象不存在时,比如一个不存在的主键,会抛出 org.hibernate.ObjectNotFoundException;
      load()方法应用了延迟加载机制。

      get()方法查询的对象不存在时,返回null;
      get()方法不采用延迟加载机制。
 
   延迟加载:
     当结果被调用的时候才执行,不调用不执行。  
     不使用延迟加载的get,在代码运行的过程中,不管后面结果被不会调用,都会执行并获取结果。
      load()延迟加载仅用于查询已知唯一记录的情况。

      与lazy的区别见上面5中的比较。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics