hibernate之延迟加载(Lazy Loading)

避免在某些情况下,关联关系给我们带来无谓的开销,Hibernate引入了延迟加载的概念;

Hibernate3中的延迟记载可以针对:

  • 实体对象
  • 集合(Collection)
  • 属性的延迟加载

通过Load方法,可以返回目标实体对象的代理;

1,针对实体对象的延迟加载:

在class标签里添加lazy="true",属性:

	<class name="TUser" table="t_user" lazy="true">	

 如果将lazy="false"时,当程序运行:

TUser user = (TUser) session.load(TUser.class, new Integer(1));

 时,会发出SQL,从数据库中取出所对应的记录,并构造了一个完整的TUser对象;

如果将lazy="true"后,程序执行到:

TUser user = (TUser) session.load(TUser.class, new Integer(1));

 时,并没有任何SQL语句发出,此时对象里的属性也为空,当程序执行到:

System.out.println("user Name:"+users.getName());

 时,可以用Eclipse的Debug看到对象的属性仍然为空,但是看日志输出,会发现已经发出SQL,并也取到了其想要的name名字;

 

延迟加载和非延迟加载的差异在于Hibernate的代理机制,Hibernate引入了CGLib作为代理机制的实现,也就是我们在DeBug下可以看到TUser$EnhancerByCGLIB$$bede8986类型对象的原因;

CGLIB可以在运行期生成 java Class,这里的代理机制,其基本原理就是通过由CGLIB构造一个包含目标对象所有属性和方法的动态对象(相当于动态构造目标对象的一个子类)返回,并以之作为中介,为目标对象提供更多的特性;

这时,真正的TUser对象,位于代理类的CGLIB$CALLBACK_0.target属性中,当我们调用getName()方法时,实际上调用的是CGLIB$CALLBACK_0.getName()方法,当调用了CGLIB$CALLBACK_0.getName()后,首先会检查 CGLIB$CALLBACK_0.target中是否存在目标对象;如果存在,则调用目标对象的getName方法返回,如果目标对象为空,则发起数据库查询指令,读取记录,构建目标对象并将其设入CGLIB$CALLBACK_0.target。这样,通过一个中间代理,实现数据延迟加载功能,只有当用户真正的调用实体类的取值方法,Hibernate才会去数据库中取值;

2,类型集合的延迟加载

假如我们有个TUser实体对象,这个对象里面有Set<Book> books;属性;在我们获取TUser基本信息的时候,不必要将books一起查出来,这样的话可以给<set />标签添加lazy属性;

		<set name="books" cascade="all" lazy="true">

 这样的话,只有我们实际中真正的用到book了,才会去数据库里查询!

3,属性延迟加载

现将其属性设置:

		<property name="name" lazy="true"/>

配置了lazy属性之外,还要借助类增强器对二进制Class文件进行强化处理(buildtime bytecode instrumentation)。通过ANT调用Hibernate类增强器对TUser.class文件进行强化处理。脚本如下:

<project name="HibernateSample" default="instrument" basedir=".">
  <property name="lib.dir" value="./lib"/>
  <property name="classes.dir" value="./bin"/>
  
  <path id="lib.class.path">
     <fileset dir="${lib.dir}">
         <include name="**/*.jar"/>
     </fileset>
   
  <target name="instrument">
     <taskdef name="instrument"
         classname="org.hibernate.tool.instrument.InstrumentTask">

        <classpath path="${classes.dir}"/>
        <classpath refid="lib.class.path"/>
     </taskdef>
        
     <instrument verbose="true">
        <fileset dir="${classes.dir}/com.redsaga/hibernate/db/entity">
           <include name="TUser.class"/>
        </fileset>
     </instrument>
  </target>
</project>
 
maxwell与steady state thermal 通过workbench耦合仿真 文章目录maxwellsteady state thermal maxwell 1加入maxwell并打开 2导入模型 3选择求解器类型:涡流求解器eddy current 4修改模型名字不能带_等特殊符号 5为模型赋材料 6设立3D边界,各边电流进出方向为0其余方向300 7设置激励条件,可设置电流大小,相位,方向 8设置集肤深度,选取中间铜导体的体然后设置,如何设置看帮助文档 9求解设置 迭代步数 收敛精度 交流电频率 10验证条件满足计算 11求解 发现无法求解,删除ai 阅读详情

相关推荐

BU61580芯片实战:手把手教你配置1553B通信的BC端寄存器(含代码解析)

本文详细解析了BU61580芯片在1553B通信中的BC端寄存器配置方法,包括关键寄存器功能映射、初始化代码解析及回环测试实现。通过实战案例和代码示例,帮助开发者快速掌握1553B通信的核心技术,提升系统稳定性和通信质量。

a1b2c的博客 224

Hibernate3延迟加载(lazy loading)详细分析与解释

Hibernate3延迟加载(lazy loading)详细分析与解释 一.延迟加载定义: 延迟加载(lazy load)是(也称为懒加载)Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。可以简单理解为,只有在使用的时候,才会发出sql语句进行查询。 二.延迟加载的运行的方式:

xiao_ma_guo_he的专栏 941

别再浪费NFC了!手把手教你用Android手机模拟门禁卡(Mifare Classic破解教程)

本文深入探讨Android NFC技术的核心原理与创新应用,教你如何利用手机模拟门禁卡(Mifare Classic破解教程),解锁智能生活的无限可能。涵盖NFC标签类型解析、HCE开发实战及安全实践,让你的Android设备成为数字生活的万能钥匙。

weixin_29239661的博客 230

Hibernate深入浅出(八)持久层操作——延迟加载(Lazy Loading)

为了避免在某些情况下,关联关系所带来的无谓的性能开销。所谓延迟加载,就是在需要数据的时候,才真正执行数据加载操作。Hibernate2中的延迟加载实现主要针对:1. 实体对象。2. 集合(Collection)。Hibernate3同时提供了属性的延迟加载功能。1. 实体对象的延迟加载通过load方法可以指定可以返回目标实体对象的代理。通过class的lazy属性...

weixin_34124577的博客 425

VS Code配置MASM32汇编环境:从安装到调试的完整指南

本文提供了一份详尽的指南,教你如何在VS Code中配置MASM32汇编开发环境,实现从安装、环境变量设置到编写、编译和调试32位Windows汇编窗口程序的完整工作流。通过集成现代编辑器的便利性与经典汇编工具链,旨在降低学习门槛,提升底层开发效率。

nn3456的博客 484

Python实战:5分钟搞定高德地图API批量地址转经纬度(附完整代码)

本文提供了一套完整的Python解决方案,利用高德地图Web服务API,实现批量地址到经纬度坐标的自动化转换。文章包含从API申请、核心代码编写到错误处理与性能优化的全流程实战指南,并附赠数据可视化方法,帮助数据分析师和开发者快速提升地理信息处理效率。

weixin_29047919的博客 582

08 | Jackson 注解在实体里面如何应用?常见的死循环问题如何解决?

我们用 Spring Boot 里面默认集成的 fasterxml.jackson 加以说明,这看似和 JPA 没什么关系,但是一旦我们和 @Entity 一起使用的时候,就会遇到一些问题,特别是新手同学,我们这一课时详细介绍一下用法。先来跟着我了解一下 Jackson 的基本语法。

一叶知春秋 1199

pytorch中的wheel文件

whl 文件是 Python 的一个软件包分发格式,用于在 Python 中安装软件包。它是 Python Wheel 的缩写,也被称为 wheel 文件。这种文件格式旨在简化 Python 软件包的安装和分发。对于 PyTorch 而言,它提供了预编译的 .whl 文件,您可以通过 pip 安装这些文件来快速方便地安装 PyTorch。这些 .whl 文件是已经编译好的二进制分发文件,可以直接安装在您的 Python 环境中,而无需再进行编译。

bj_zhb的博客 3127

什么是Hibernate的懒加载和立即加载?它们之间有什么区别?

但是,如果在使用懒加载的对象后关闭了Session,那么在访问其关联对象的属性时,就会抛出LazyInitializationException异常,因为Hibernate需要在Session的作用范围内才能发出SQL语句加载数据。HQL是Hibernate特有的查询语言,它类似于SQL,但它是面向对象的查询语言,可以直接使用类名和属性名来编写查询语句,无需关心具体的数据库表和字段。加载时机:懒加载是在真正需要访问关联对象的属性时才加载数据,而立即加载是在加载对象时立即加载关联对象的数据。

Aaron的博客 554

Android Audio基础——系统服务(二)

AudioService 继承自 IAudioService.Stub。IAudioService.Stub 类很明显是通过 IAudioService.aidl 自动生成的。AudioService 位于 Binder Native 端。AudioManager 拥有 AudioService 的 Binder Proxy 端,是 AudioService 在客户端的一个代理。几乎所有客户端对 AudioManager 进行的请求,最终都会交由 AudioService 实现。

小旭的专栏 2073

OpenClaw人人养虾:发现与传输

客户端需要先"发现"Gateway 的地址和端口,才能建立连接。OpenClaw 支持多种发现(Discovery)和传输(Transport)机制。

王国平的博客 572

Hibernate lazy load

项目中使用了很多many-to-one的映射,刚开始的时候不加lazy=false会报这个错误  could not initialize proxy - no Session 加上lazy=false确实没有报错了,但是后来做性能测试的时候确确实实为此感到羞耻,因为每次都会有很多无用的sql执行。 下定决心去掉lazy=false,Spring提供了OpenSessionInViewI

nokiaisacat的专栏 984

人群仿真软件:AnyLogic_(12).AnyLogic高级功能应用

在AnyLogic中,自定义行人行为是通过编写Java代码来实现的。行人行为的自定义可以包括行走路径的选择、速度变化、交互行为等。这使得仿真模型更加灵活和真实。

kkchenjj的博客 1060

Hibernate延迟加载 lazy loading

延迟加载在Hibernate中是默认延迟加载; 测试代码一: HibernateTest.java 代码: /*** */package com.b510.examples; import java.util.Set; import org.hibernate.Session; /*** * @author XHW* * @date 2011-7-18* *...

abxlep7702的博客 154

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java lazy loading_Hibernate延迟加载 lazy loading

延迟加载在Hibernate中是默认延迟加载;测试代码一:HibernateTest.java代码:/****/package com.b510.examples;import java.util.Set;import org.hibernate.Session;/**** @author XHW** @date 2011-7-18**/public class HibernateTest {pu...

weixin_39782709的博客 211

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

延迟加载异常时自动open session-Hibernate Lazy Loading patch

Hibernate Lazy Loading patch – 08-1-21 I was frustrated with the way that Hibernate handles lazy initialization, because there are certain cases, especially in a Swing application, where it is ve...

刘晔的日积月累 181

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) )

博客园手机版-关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) )<!--body{font-size:12px;line-height:150%}a:link,a:visited,a:hover,a:active{text-decoration:none;color:#075DB3;}.blue{ color:#075DB3; }-

lovehmj的专栏 795

Hibernate lazy load.

HIBERNATE的持久化对象加载策略。 延迟加载, 也就是用到的时候才去加载.这样可以提高一些性能. Hibernate的lazy loading 采用了一个HibernateSession来管理session,它的逻辑是每进行一次数据库操作,就开新的session,操作完成后立即关闭该session。这样做的好处是可以严格关闭session,避免菜鸟级的错误,但是hibernate.o...

a542939658的博客 360

OpenSessionInViewFilter使用

转载地址:http://sourabhissourabh.blogspot.com/2008/03/what-is-opensessioninviewfilter-and-how.html What is OpenSessionInViewFilter and how to use it? Recently, in one of our proj...

liuxinan0402的专栏 152

论hibernate框架在eclipse和IDEA中的区别

eclipse 1.eclipse中的测试结果: 涉及到的问题:hibernate框架的Session方法的load方法和get方法的加载模式 a.get方法:立即 这是工具类 package com.DenisDLF.hibernate.utils; import org.hibernate.Session; import org.hibernate.SessionFactory; impor...

weixin_42078655的博客 242

关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) ) 等

关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) ) 等 在使用hibernate进行持久化时,有时需要动态的改变对象的加载,比如在编辑页面里面lazy=true,而在浏览页面lazy=false,这样可以在需要lazy的地方才进行控制。而配置文件中Lazy属性是全局控制的,如何处理呢?        在配置文件里面可以用lazy=tru

燕窝 8478

hibernate级联

级联操作  一.简单的介绍 cascade和inverse (Employee – Department) l  Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作,常用的cascade:          none,all,save-update,delete, lock,refresh,evict,replicate,persist,

andyLiuJava的专栏 469

hibernate lazy加载

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33766805的博客 87

强制加载lazy ----Hibernate.initialize

PO 即Persistence Object VO 即Value Object PO 和VO 是Hibernate 中两个比较关键的概念。 首先,何谓VO,很简单,VO 就是一个简单的值对象。 如: TUser user = new TUser(); user.setName("Emma"); 这里的user 就是一个VO。VO 只是简单携带了对象的一些属性信息...

huliangyu的专栏 160

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

<filter> <filter-name>osivFilter</filter-name> <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class> </filter> <filter-mapping> <filter-name>osivFilter</filt

专栏 3288

hibernate懒加载

所谓懒加载(lazy)就是延时加载,延迟加载。 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载。 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗, 我们让数据在需要的时候才进行加载,这时我们就用到了懒加载。 比如部门ENTITY和员工ENTITY,部门与员工1对多,如果lazy设置为

fyqcdbdx的专栏 458
上一篇: Hibernate查询之list/iterator
下一篇: hibernate之数据存储
keithJava
博客等级 码龄16年 2粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值