Hibernate 的延迟加载(懒加载)简介1

什么是延迟加载:
  • 在使用某些Hibernate方法查询数据时,Hibernate返回的只是一个空对象(除id外属性都为null),并没有真正查询数据库。而在使用这个对象时才会触发查询数据库,并将查询到的数据注入到这个空对象中。这种将查询时机推迟到对象访问时的机制称之为延迟加载。

为什么要使用延迟加载:
  • 可以提升内存资源的使用率

  • 可以降低对数据库的访问次数


采用延迟加载的方法:
  • session.load()
    • 查询时不进行SQL查询,在使用对象时才执行SQL查询;效率高
  • query.iterate()
    • 在查询时只查询了ID,而只有在使用对象时才会查询对象的完整信息,每用一个对象查询一次,增加了查询次数;效率低
  • 关联映射中对关联属性的加载

    • one-to-one(元素)懒加载 :
      必须同时满足下面三个条件时才能实现懒加载
      (主表不能有constrained=ture,所以主表没有懒加载)
      (1)、 lazy!=false
      (2)、 consetrained=ture
      (3)、fetch=select

    • one-to-many(元素)懒加载:
      (1)、lazy!=false
      (2)、fetch=select

    • many-to-one(元素) :
      (1)、lazy!=false
      (2)、fetch=select
    • many-to-many(元素) :
      (1)、lazy!=false
      (2)、fetch=select
注意:
  • 能够懒加载的对象都是被改写过的代理对象.

  • 当相关联的session没有关闭时.访问这些懒加载对象(代理对象)的属性(getId和getClass除外);hibernate会初始化这些代理.或用Hibernate.initialize(proxy)来初始化代理对象

  • 当相关联的session关闭后,在访问懒加载的对象将出现异常

  • Lazy:指相关联的属性什么时候抓取

  • Fetch:通过什么方式来进行抓取 select二次select语句查询 Join连接查询,lazy属性就不起作用


使用延迟加载需要注意的问题
  • 采用具有延迟加载机制的操作,需要避免Session提前关闭,避免在使用对象之前关闭session。
  • 可以采用以下两种方法解决此问题
    • 采用非延迟加载的查询方法,如query.get()、session.list()等。
    • 在使用对象之后再关闭session。

Open session in view
  • 在项目中,DAO只是负责查询出数据,而使用数据的时机是在JSP解析的过程中,因此要避免在DAO中关闭session,或者说要在视图层保持session的开启。
  • 项目中解决这个问题的手段称之为Open session in view,即在视图层保持session的开启。
  • 在不同的技术框架下,实现Open session in view的手段不同:
    • 在Servlet中使用过滤器实现
    • 在Struts2中使用拦截器实现
    • 在Spring中使用AOP实现

延迟加载实现原理
  • 采用延迟加载方法,返回的对象类型是Hibernate采用CGLIB技术在内存中动态生成的类型,该类型是原实体类的子类,并在子类中重写了属性的get方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值