7.Hibernate 延迟加载&立即加载

延迟加载的好处
1.降低了内存的开销,在用到某些数据的时候才会到数据中进行查询。
2.提高了程序运行性能。
注:如果session被关闭了,而你又想用到某些数据,这个时候使用延迟加载会出错;需要立即加载或者使用OpenSessionInView。

立即加载的坏处
1.select语句的数目太多,需要频繁的访问数据库,会影响查询性能。
2.如在应用程序只需要访问DEPT对象,而不需要访问EMP对象的场合,加载EMP对象完全是多余的操作,这些EMP对象白白浪费了内存空间。
注:如果session被关闭了,而你想访问EMP对象,这个时候是不会出错的,因为对象都被加载到内存了。

lazy属性

类级别1.true 延迟加载(默认值)
2.false 立即加载
一对多级联级别1.true  延迟加载(默认值)
2.extra  增强延迟加载
3.false  立即加载
多对一关联级别1.proxy  延迟加载(默认值)
2.no-proxy 无代理延迟加载
3.false  立即加载

类级别,使用<class>元素来配置加载策略
立即加载
  将lazy属性设置为false则为立即加载。
  当时用load方法查询数据的时候,会立即执行一条select语句,来查询出数据。
延迟加载
  如果程序加载一个持久化对象的目的是为了访问它的属性,则可以采用立即加载。如果程序加载一个持久化类对象的目的仅仅是为了获取它的引用,而不访问它的数据,则可以使用延迟加载。例如:
Dept dept = (Dept)session.load(Dept.class, 10);
Emp emp = new Emp(1,"TOM");
emp.setDept(dept);
session.save(emp);
  说明向数据保存了一个Emp对象,他与一个Dept对象进行了关联。如果Dept使用了延迟加载,则session不会执行select语句来查询对应的数据,这个时候Dept对象中的ID属性为你设置的10,其他属性则为null,这是load方法的特点。


一对多和多对多关联的查询策略,使用<set>元素来配置一对多或多对多加载策略
<set>元素的lazy属性,主要决定Dept对象的emps集合(emps属性是Set集合)被初始化的时机,到底是加载Dept对象时就被初始化(从数据查询数据),还是在程序访问emps集合的时候在初始化。
立即加载
  通过Session的get方法加载ID为10的Dept对象。
  Hibernate会执行两条select语句,第一条是select * from Dept where deptno = ?第二条select * from Emp where DEPTNO = ?
  也就是说使用立即查询,不管你有没有用到emps集合中的数据,Hibernate都将给你查询出来,放到内存中。
延迟加载
  延时加载只会先执行一条select语句,select * from Dept where deptno = ?。当你使用到了emps集合的时候,才会执行第二条select * from Emp where DEPTNO = ?语句来查询出对应的数据。

多对一关联的查询策略,在<many-to-no>元素用来设设置。

立即加载
  立即加载和上面一样,会执行两条select语句来加载数据。
延迟加载
  当使用get方法时,立即执行查询Emp对象的select语句,Emp对象的dept属性引用Dept代理类的实例,这个代理类实例的OID有EMP表的DEPTNO外键值决定。当使用dept属性的时候才会执行select语句来查询Dept信息。













  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值