hibernate实体及集合属性、关联实体的延迟加载
2018-01-21 23:17
399 查看
一.什么是懒加载?
延迟加载,也叫懒加载,它是Hibernate为提高程序执行效率而提供的一种机制,即只有真正使用该对象的数据时才会创建。Hibernate中主要是通过代理(proxy)机制来实现延迟加载。它的具体过程:Hibernate丛数据库获取某一个对象数据时、获取某一个对象的集合属性值时,或获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据,hibernate并不是数据库加载真正的数据,而只是为该对象创建一个代理对象来代表这个对象,这个对象上的所有属性都是默认值;只有在真正需要使用该对象的数据时才创建这个真实对象,真正从数据库中加载它的数据,这样在某些情况下,就可以提高查询效率。
有如下程序代码:
User user=(User)session.load(clazz, id);//直接返回的是代理对象
System.out.println(user.getId());//没有发送sql语句到数据库加载
user.getName();//创建真实的User实例,并发送sql语句到数据库中
注意:
1、不能判断User=null;代理对象不可能为空。
2、代理对象的限制:和代理关联的session对象,如果session关闭后访问代理则抛异常。session关闭之前访问数据库。
3、getId()方法不行因为参数为ID,getClass()方法不用访问数据库就可以得到的数据。
二.默认延迟加载
1、当调用session上的load()加载一个实体时,默认采用延迟加载。2,当session加载某个实体时,会对这个实体中的集合属性(OneToMany)值默认采用延迟加载。
3、当session加载某个实体时,会对这个实体所有单端关联的另一个实体对象(ManyToOne)采用延迟加载(网上资料这样说,但是本人测试并非默认延迟加载关联实体,我用的是hibernate4.x版本)。
三.关闭延迟加载
延迟加载确实会给程序的查询效率带来好处,但有时明确知道数据需要立即加载,如果Hibernate先默认使用延迟加载,而后又必须去数据库加载,反而会降低效率。1、加载单个实体,如果不需要延迟加载,就可以使用session的get()方法。
2、当session加载某个实体时,不需要对这个实体中的集合属性值延迟加载,而是要立即加载;配置@OneToMany(fetch=FetchType.EAGER)。
3、当session加载某个实体时,不需要对这个实体所单端关联的另一个实体对象延迟加载;配置@ManyToOne(fetch=FetchType.EAGER)。
四.抓取策略
1、懒加载实体:session.load()
2、one-to-one(元素)懒加载:
1)constrained!=true 2)@Proxy(lazy = true)(类注解) 3)@OneToOne(fetch=FetchType.LAZY)
3、one-to-many (元素)懒加载:
1)@OneToMany(fetch=FetchType.LAZY)(默认)
4、many-to-one (元素)
懒加载:
1)@Proxy(lazy = true)(类注解) 2)@ManyToOne(fetch=FetchType.LAZY)
5.many-to-many (元素) :
1)@ManyToMany(fetch=FetchType.LAZY)(默认)
相关文章推荐
- 《Entity Framework 6 Recipes》中文翻译系列 (29) ------ 第五章 加载实体和导航属性之过滤预先加载的实体集合和修改外键关联
- Hibernate性能调优--集合属性的延迟加载
- Hibernate性能调优--关联实体的延迟加载
- Hibernate集合属性的延迟加载
- Hibernate 集合属性的延迟加载
- Hibernate中的延迟加载、实体关联单向一对多及双向一对多实体关联
- Hibernate延时加载---集合属性的延迟加载
- Hibernate3 实体属性的延迟加载——Hibernate深入浅出
- SSH与SSM学习之hibernate23——关联级别加载策略之集合关联加载策略
- Hibernate的关联映射---6.1.10: 复合主键的成员属性为关联实体
- Hibernate关联映射之延迟加载
- 《Entity Framework 6 Recipes》中文翻译系列 (22) -----第五章 加载实体和导航属性之延迟加载
- 《Entity Framework 6 Recipes》中文翻译系列 (26) ------ 第五章 加载实体和导航属性之延缓加载关联实体和在别的LINQ查询操作中使用Include()方法
- Hibernate的延迟加载(3)——集合的延迟加载
- hibernate设置延迟加载后获得关联对象报错的解决方案
- Hibernate使用LAZY延迟加载,initialize获取延迟加载关联内容
- 019 关联映射文件中集合标签中的lazy(懒加载)属性
- SSH与SSM学习之hibernate24——关联级别加载策略之属性关联加载策略
- 《Entity Framework 6 Recipes》中文翻译系列 (28) ------ 第五章 加载实体和导航属性之测试实体是否加载与显式加载关联实体
- Hibernate延迟加载之属性延迟加载