`
zengguo1988
  • 浏览: 280231 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Hibernate延迟加载实现原理

    博客分类:
  • J2EE
阅读更多

   通过将class的lazy属性设置为true,来开启实体的延迟加载特性。如果我们运行下面的代码:
  User user=(User)session.load(User.class,"1");(1)
  System.out.println(user.getName());(2)


   当运行到(1)处时,Hibernate并没有发起对数据的查询,如果我们此时通过一些调试工具(比如Eclipse的Debug工具),观察此时user对象的内存快照,我们会惊奇的发现,此时返回的可能是User$EnhancerByCGLIB$$bede8986类型的对象,而且其属性为null,这是怎么回事?session.load()方法会返回实体对象的代理类对象,这里所返回的对象类型就是User对象的代理类对象。在Hibernate中通过使用CGLIB,来实现动态构造一个目标对象的代理类对象,并且在代理类对象中包含目标对象的所有属性和方法,而且所有属性均被赋值为null。通过调试器显示的内存快照,我们可以看出此时真正的User对象,是包含在代理对象的CGLIB$CALBACK_0.target属性中,当代码运行到(2)处时,此时调用user.getName()方法,这时通过CGLIB赋予的回调机制,实际上调用CGLIB$CALBACK_0.getName()方法,当调用该方法时,Hibernate会首先检查CGLIB$CALBACK_0.target属性是否为null,如果不为空,则调用目标对象的getName方法,如果为空,则会发起数据库查询,生成类似这样的SQL语句:select * from user where id=’1’;来查询数据,并构造目标对象,并且将它赋值到CGLIB$CALBACK_0.target属性中。

 

    这样,通过一个中间代理对象,Hibernate实现了实体的延迟加载,只有当用户真正发起获得实体对象属性的动作时,才真正会发起数据库查询操作。所以实体的延迟加载是用通过中间代理类完成的,所以只有session.load()方法才会利用实体延迟加载,因为只有session.load()方法才会返回实体类的代理类对象。

分享到:
评论

相关推荐

    Hibernate延迟加载以及利用Spring

    #### 一、Hibernate延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正需要数据时才加载数据,而不是一开始就...

    hibernate 延迟加载深入剖析

    ### Hibernate延迟加载深入剖析 #### 一、概述 在现代软件开发中,特别是与数据库交互的应用场景下,Hibernate作为一款流行的Java持久层框架,提供了多种高效处理数据的技术。其中,延迟加载(Lazy Loading)是一...

    hibernate延迟加载解决

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

    Hibernate 延迟加载剖析与代理模式应用

    ### Hibernate延迟加载剖析与代理模式应用 #### 一、引言 在现代软件开发中,尤其是在基于Java的企业级应用开发中,Hibernate作为一种流行的ORM(Object Relational Mapping)框架,极大地简化了开发者对数据库的...

    hibernate 延迟加载.docx

    **延迟加载的实现原理** 当使用Hibernate的`Session.load()`方法或在映射文件中设置了`lazy="true"`时,Hibernate并不会立即从数据库中获取关联对象的所有数据,而是创建一个代理对象。这个代理对象在需要访问其...

    Hibernate的延迟加载

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

    hibernate延迟加载技术详细解

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

    Hibernate延迟加载

    ### Hibernate延迟加载深入解析 #### 一、概念与原理 **延迟加载**(Lazy Loading)是Hibernate框架中的一个重要特性,主要用于优化数据库操作,减少不必要的数据加载,从而提升应用程序的性能。在传统的Eager ...

    Hibernate集合属性的延迟加载.doc

    延迟加载的工作原理基于代理模式。Hibernate 会创建一个代理对象,代替实际的集合对象。当尝试访问集合属性时,代理对象会检测到这个操作,并触发数据库查询来获取实际的数据。只有在调用集合的某个方法(如 `size()...

    Hibernate延迟加载原理与实现方法

    Hibernate延迟加载是一种优化数据库操作的技术,它旨在减少不必要的数据库访问,从而提高应用程序的性能。当我们在Hibernate中使用延迟加载时,只有在实际需要数据时,才会从数据库中加载相关对象,而不是在初始加载...

    Hibernate lazy延迟加载

    在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种重要的优化策略,它的核心思想是“延迟加载”或“按需加载”。默认情况下,当一个实体被加载时,并不会立即加载其关联的对象或集合,而是在真正需要...

    Hibernate性能(缓存 延迟加载 事务 悲观 乐观锁).ppt

    Hibernate延迟加载(Lazy Loading)** 延迟加载是一种优化策略,只在真正需要数据时才执行数据库查询。例如,当实体对象的集合属性未被访问时,Hibernate不会立即加载这些数据,而是等到需要时才加载,减少不必要的...

    延迟加载技术

    例如,在ORM(对象关系映射)框架如Hibernate中,一个实体可能有多个关联的对象,如果这些关联对象在初次加载时不被立即需要,那么可以设置为延迟加载。只有当试图访问这些关联对象时,才会执行SQL查询来获取它们,...

    Hibernate延时加载与lazy机制.doc

    Hibernate的延迟加载(Lazy Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...

    hibernate懒加载策略.doc

    - 针对集合类型的延迟加载,Hibernate做了特别优化,如使用自定义的JDK Collection实现,如`PersistentSet`、`PersistentList`等。这些集合在初始化时不加载元素,只有在迭代或访问集合内的元素时,才触发数据库...

    Strut+Spring+Hibernate框架的工作原理

    Hibernate提供了延迟加载机制,可以在真正需要数据时才将其加载到内存中,从而节省服务器的内存开销。Hibernate的延迟加载机制可以分为两种: 1. 实体对象的延迟加载 2. 集合的延迟加载 Hibernate的映射关系 ...

    hibernate的延迟检索在轻量级J2EE框架中的应用

    Hibernate延迟检索的原理 ##### 实体对象的延迟加载 实体对象的延迟加载是指当真正需要某个实体对象的数据时,才执行数据加载操作。在Hibernate中,可以通过在实体的映射配置文件中设置`lazy="true"`来启用实体...

    Spring+Hibernate+Struts工作原理

    Hibernate的延迟加载(Lazy Loading)特性是其一大亮点,它可以减少内存占用,提高性能。例如,当获取一个实体对象时,与其关联的集合默认不会立即加载,而是在第一次访问时才加载,这就是延迟加载。 类之间的关系...

    SSH延迟加载的一个小DEMO

    在压缩包中的`Defer_Test`文件可能是测试代码,包含了对这些延迟加载方法的实例化和执行,这对于初学者来说是理解延迟加载原理和实践的好资源。通过阅读和运行这些测试,你可以看到每个方法在不同场景下的表现,理解...

    Hibernate、Spring和Struts工作原理及使用理由

    Hibernate支持实体对象和集合的延迟加载,只有在实际需要时才会加载相关数据,节省内存,提高性能。 **类间关系**: Hibernate通过配置文件支持一对一、一对多、多对一和多对多的关系映射。 **缓存机制**: - **一...

Global site tag (gtag.js) - Google Analytics