hibernate延迟加载
来源:互联网 发布:js获取手机唯一标识码 编辑:程序博客网 时间:2024/06/16 17:11
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.Java:111)
在做一个项目的时候遇到了这个问题,大概的意思是不能 初始化,session 关闭了的,于是就想到可能是session关闭了 而程序某个地方还在从数据库中读取数据
于是就上网百度了一下, 说的是在用多对一或者是多对多的时候懒加载的问题
下面先看下 hibernate里lazy 的内容(上面出错的解决办法,我会在下面给出)
lazy,延迟加载
Lazy的有效期:只有在session打开的时候才有效;session关闭后lazy就没效了。
1 get和load的区别:
* get不支持延迟加载,而load支持。
* 当查询特定的数据库中不存在的数据时,get会返回null,而load则抛出异常。
2 类(Class)的延迟加载:
* 设置<class>标签中的lazy="true",或是保持默认(即不配置lazy属性)
* 如果lazy的属性值为true,那么在使用load方法加载数据时,只有确实用到数据的时候才会发出sql语句;这样有可能减少系统的开销。
* //不会发出查询sql
这里有一个问题,为什么加载主键的时候不需要发出sql语句。
3 集合(collection)的延迟加载:可以取值true,false,extra
* 保持集合上的lazy的默认值,此时的效果和lazy="extra"是基本一样的。
* 设置集合上的lazy=false
true:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其集合元素的数据
false:取消懒加载特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据
extra:一种比较聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate
【解决办法】下面给出三种解决办法,个人认为第二种比较好
1、把lazy设成false。这个是最简单的办法,个人认为也是比较笨的方法。因为这是在用效率作为代价。
2、使用OpenSessionInViewFilter。这种方法是将session交给servlet filter来管理,每当一个请求来之后就会开
启一个session,只有当响应结束后才会关闭。如下:
上面的配置文件时在web.xml中配置的。
3、将hibernate的抓起策略改为join。也就是是left join fetch或inner join fetch语法。就是在<many-to-one../>中配
置lazy="false" fetch="join"即可。如:
- Hibernate中的延迟加载
- Hibernate延迟加载机制
- Hibernate延迟加载机制
- 再论hibernate延迟加载
- HIBERNATE延迟加载原理
- Hibernate延迟加载机制
- Hibernate延迟加载
- hibernate延迟加载
- hibernate延迟加载
- Hibernate延迟加载机制
- Hibernate延迟加载机制
- Hibernate延迟加载机制
- Hibernate延迟加载机制
- Hibernate延迟加载
- Hibernate属性延迟加载
- hibernate延迟加载
- HIbernate延迟加载
- hibernate 延迟加载
- 2016 第七届 蓝桥杯国赛 凑平方数
- 【Tensorflow】Anaconda中激活tensorflow后如何使用
- matlab之unwrap函数
- c++11模板别名using=
- 1764--矩阵转置(数据结构高分笔记)
- hibernate延迟加载
- RUCM使用实例
- js中控制物体无延迟移动的思路
- Kotlin_函数的定义与用法
- 阿里巴巴---测试开发
- redis 学习笔记二 (简单动态字符串)
- Mac系统开发常见问题-80端口被占用的解决方案1-使用pfctl做网络层转发
- 浅谈JavaScript七种数据类型
- linux重定向与管道