专栏首页行者常至Hibernate 的延迟加载(懒加载)简介1

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方法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Hibernate中 对象 的三种状态

    qubianzhong
  • Hibernate的5个核心接口:Session、SessionFactory、Transaction、Query和Configuration

    qubianzhong
  • final、abstract、interface

    【包含抽象方法的类一定是抽象类;抽象类中可包括非抽象方法(具体的方法)。抽象类无法实例化,不能创建对象,只能通过子类继承,然后通过方法覆盖。如果不覆盖抽象方法,...

    qubianzhong
  • 计算机网络自学笔记:无连接传输UDP

    UDP 只是做了传输协议能够做的最少工作。除了多路复用/多路分解功能及少量的差错 检测外,它几乎没有对 IP 增加别的东西。

    云时之间
  • nginx负载均衡session共享解决方案

    服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状...

    故久
  • Hibernate api 之常见的类(配置类,会话工厂类,会话类)

    1:Configuration :配置管理类对象   1.1:config.configure():      加载主配置文件的方法(hibernate.cfg...

    别先生
  • shiro中改造成restful无状态服务的DisabledSessionException问题分析与解决

    运行后,在调用 subject.login(token)方法时报错,报错信息如下:

    开发架构二三事
  • WordPress主题中加载jQuery的最佳方法

    一般来说,在html页面底部 (也就是</body>之前)引入JavaScript,如jQuery 和 jQuery插件是个不错的做法。原因很简单,HTTP /...

    丘壑
  • AI3.0:哈希图来了!它将如何变革AI与区块链技术?

    2017年大热的几个概念:AI、机器人、区块链、工业4.0……他们看似彼此孤立,但事实上正在被逐渐集合于一体,创造功能更强大、执行任务更加智能的实体。毕业于哈佛...

    企鹅号小编
  • 世界 10 大编程语言,Java 不是第一,PHP 才第五

    如果你是软件开发领域的新手,那么你会想到的第一个问题是“如何开始?”编程语言有数百种可供选择,但是你怎么发现哪个最适合你,你的兴趣和职业目标又在哪里呢?选择最佳...

    一个优秀的废人

扫码关注云+社区

领取腾讯云代金券