`
kings_wang
  • 浏览: 1240 次
社区版块
存档分类
最新评论

hibernate延迟加载(懒加载)详解

阅读更多
延迟加载
一.什么是懒加载?他的作用?
延迟加载,也叫懒加载,它是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;代理对象不可能为空
代理对象的限制:和代理关联的session对象,如果session关闭后访问代理则抛异常。session关闭之前访问数据库
2.getId()方法不行因为参数为ID,getClass()方法不用访问数据库就可以得到的数据
Hibernate中默认采用延迟加载的情况主要有以下几种
1,当调用session上的load()加载一个实体时,会采用延迟加载。
2,当session加载某个实体时,会对这个实体中的集合属性值采用延迟加载
3当session加载某个实体时,会对这个实体所有单端关联的另一个实体对象采用延迟加载。
二.关闭延迟加载
       延迟加载确实会给程序的查询效率带来好处,但有时明确知道数据需要立即加载,如果Hibernate先默认使用延迟加载,而后又必须去数据库加载,反而会降低效率
1.     加载单个实体,如果不需要延迟加载,就可以使用session的get()方法。
2.     当session加载某个实体时,不需要对这个实体中的集合属性值延迟加载,而是要立即加载。这是可以在映射文件中这个集合的配置元素(set bag list)添加属性lazy=false;
3.     当session加载某个实体时,不需要对这个实体所单端关联的另一个实体对象延迟加载,就可以在影射文件中针对这个单端关联的配置元素(<one-to-one><many-to-one>)添加lazy=false;
三.抓取策略
   通过asm和cglib二个包实现;Domain是非final的。
1.session.load懒加载。
2.one-to-one(元素)懒加载:
       必需同时满足下面三个条件时才能实现懒加载
       (主表不能有constrained=true,所以主表没有懒加载)
       lazy!=false 2)constrained=true3)fetch=select
3.one-to-many (元素)懒加载:1)lazy!=false 2)fetch=select
4.many-to-one (元素) :1)lazy!=false 2)fetch=select
5.many-to-many (元素) :1)lazy!=false 2)fetch=select
6.能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性(getId和getClass除外)hibernate会初始化这些代理,或用Hibernate.initialize(proxy)来初始化代理对象;当相关联的session关闭后,再访问懒加载的对象将出现异常。
分享到:
评论

相关推荐

    hibernate延迟加载解决

    ### Hibernate延迟加载详解 #### 一、什么是延迟加载? 延迟加载是一种优化技术,在软件开发中广泛应用于各种场景,尤其在数据库交互中尤为重要。其核心思想是仅在确实需要某个资源时才加载它,而非一开始就加载...

    Hibernate 延迟加载

    #### 什么是Hibernate延迟加载? 在探讨Hibernate延迟加载之前,我们先简要回顾一下Hibernate框架。Hibernate是一种流行的Java持久层框架,它提供了对象关系映射(ORM)的功能,允许开发者以面向对象的方式操作...

    hibernate延迟加载技术详细解

    ### Hibernate 延迟加载技术详解 #### 一、概述 在 Hibernate 框架中,延迟加载(Lazy Loading)是一种非常重要的优化技术,它能够有效地减少数据库查询次数,提高应用性能。通常,在多对多或者一对多的关系中,...

    Hibernate延迟加载介绍.doc

    《Hibernate延迟加载详解》 Hibernate作为Java领域中的一个强大的对象关系映射框架,提供了许多优化数据库操作的策略,其中之一便是延迟加载(Lazy Loading)。延迟加载机制旨在减少不必要的性能消耗,只在真正需要...

    Hibernate的延迟加载

    集合类型的延迟加载是Hibernate延迟加载机制中最能显著提升性能的部分。在Hibernate中,集合类型的延迟加载通过使用自定义的集合类实现,如`net.sf.hibernate.collection.Set`,而非标准的`java.util.Set`。这样,...

    hibernate延迟加载

    ### Hibernate延迟加载详解 #### 一、概述 Hibernate 是一种常用的 Java 持久层框架,它能够将 Java 应用程序与底层数据库之间建立桥梁,简化数据访问逻辑。为了提高应用程序性能,Hibernate 提供了多种优化手段,...

    Hibernate延迟加载技术详解

    在 Hibernate 框架中,延迟加载(Lazy Loading)是一项核心功能,旨在提高应用程序的性能和效率。它允许数据在真正需要时才从数据库加载,而不是在加载实体时一次性加载所有关联数据。这降低了内存消耗,因为不是...

    06_传智播客JPA详解_大数据字段映射与字段延迟加载

    在这个"06_传智播客JPA详解_大数据字段映射与字段延迟加载"的自学视频中,我们将会深入探讨两个关键概念:大数据字段的映射和字段的延迟加载。 首先,让我们来理解大数据字段映射。在数据库中,有些字段可能包含...

    hibernate包详解+hibernatePPT

    3. **延迟加载(Lazy Loading)**:只在真正需要时加载关联对象,减少内存消耗。 **六、hibernatePPT** 提供的`hibernatePPT`可能是对Hibernate框架的深入讲解,包括基本概念、配置、操作、查询、性能优化等方面,...

    精通Hibernate:Java对象持久化技术详解.pdf

    此外,本书还会深入到Hibernate的高级特性,如级联操作、延迟加载、集合映射、多态映射、关联映射(一对一、一对多、多对多)等。这些特性让开发者能够处理复杂的数据结构和业务逻辑。例如,级联操作允许一次操作就...

    持久层hibernate详解

    - **懒加载**:懒加载是一种延迟加载策略,只有当真正需要数据时才加载,有助于提高应用性能。 - **事务处理**:Hibernate支持自动事务管理,但在复杂场景下,还需要理解如何手动控制事务。 - **批量更新/删除**:在...

    hibernate对应关系详解

    7. **懒加载和立即加载**:Hibernate提供了懒加载和立即加载策略,懒加载延迟加载关联的对象,直到真正需要时才查询数据库;立即加载则是在获取父对象时一起加载关联的对象。`@LazyCollection(LazyCollectionOption....

    经典hibernate配置详解

    懒加载是一种延迟加载策略,只有在真正使用到关联对象时才去加载。立即加载则是默认行为,关联的对象会在加载主体对象时一同加载。通过配置,可以选择性地启用或禁用懒加载。 以上就是Hibernate配置的一些基础知识...

    Hibernate懒加载之&lt;class&gt;标签上的lazy

    - `&lt;many-to-one&gt;`和`&lt;one-to-one&gt;`标签:可以设置`lazy="false"/"proxy"/"noproxy"`,`proxy`表示使用代理对象延迟加载关联的对象,`noproxy`则表示不使用代理,立即加载关联对象。 测试代码中的`testLoad1()`...

    Hibernate技术详解

    - **查询灵活性**:HQL支持更多高级特性,如延迟加载、关联映射等,使得数据查询更为灵活。 ##### HQL基本查询步骤 1. **获取Hibernate Session**:首先需要获取一个Hibernate Session实例,这是执行HQL查询的基础...

    hibernate-mapping参数详解

    当设置为 true 时,Hibernate 将延迟加载关联的对象,除非明确请求。这有助于提高性能,因为并非所有关联的数据都会立即加载到内存中。 #### 3. auto-import (可选 - 默认为 true) 此属性表示是否自动导入全限定...

    Hibernate学习笔记和资料

    hibernate中一对一,一对多,多对多关系的配置,延迟加载,cascade,inverse hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式

    精通Hibernate:Java对象持久化技术详解

    9. **延迟加载**:Hibernate的懒加载机制可以在需要时才加载关联的对象,避免了不必要的数据库访问,提高了效率。 10. **事务支持**:Hibernate完全支持JTA(Java Transaction API),可以方便地集成到各种事务管理...

    struts1.2+spring2.0+hibernate3.1集成开发详解

    本篇文章将通过图文并茂的方式详细介绍如何在MyEclipse环境下,利用Struts 1.2、Spring 2.0 和 Hibernate 3.1 来构建一个查询Oracle数据库中雇员信息的应用,并探讨Hibernate中延迟加载机制的使用方法。 #### 2. 软...

    精通Hibernate:Java持久化对象技术详解[第二版]

    7. **性能优化**:讨论如何通过优化配置、批处理、延迟加载、懒加载等手段提高Hibernate的运行效率,减少数据库访问。 8. **实体生命周期**:详解Hibernate对对象状态的管理,包括瞬时态、持久态、游离态和脱管态,...

Global site tag (gtag.js) - Google Analytics