当前位置: 首页 > news >正文

hibernate延迟加载

延迟加载!

什么是延迟加载?

延迟加载时一种优化,避免无所谓的性能开销,只有在真正需要使用数据的时候才会进行数据加载操作。

延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了 对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。

延迟加载的优势以及讲解:

1、延迟加载的过程中先根据构造方法以及参数建立一个代理对象,调用到一定属性的时候执行里面的getXXX(),当执行到的getXXX()无法查询到值的时候,执行数据加载操作,也就是访问数据库,给代理对象对应属性赋值。如果没有使用延迟加载,代理对象这里会直接加载数据库,就是生成的代理对象为“最终代理对象”。

2、当加载的对象长时间不被使用的时候,该对象会被垃圾回收机制所回收

延迟加载策略原理图片:

应用程序----->代理:装载对象

代理----->数据库:调用代理方法

代理----->垃圾回收:长时间不调用

 

延迟加载优势就是节省系统内存空间。

 

使用延迟加载

1、采用延迟加载策略封的方法实现延迟加载的功能。例如load方法

Student s=session.load(Student.class,1);//1
System.out.println("name:"+s.getName());//2

   在1,2分别断点可以见到延迟加载的现象

2、通过映射文件中的属性实现延迟加载

2.1设置映射文件中的<property>元素中的lazy属性实现延迟加载

<property name="name" type="string" lazy="true" >
  <column name="NAME"/>
</property

2.2设置<class>标签的lazy属性实现延迟加载

<class name="com.hibernate.bean.Student" table="STUDENT" lazy="true">
        <id name="id" type="int">
            <column name="ID" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="description" type="java.lang.String">
            <column name="DESCRIPTION" />
        </property>
    
    </class>

2.3集合类型的延迟加载

 集合类型的延迟加载:

在Hibernate的延迟加载机制中,针对集合类型的应用,意义是最为重大的,因为这有可能 使性能得到大幅度的提高,为此Hibernate进行了大量的努力,其中包括对JDK Collection的独立实现,我们在一对多关联中,定义的用来容纳关联对象的Set集合,并不是java.util.Set类型或其子类型,而是 net.sf.hibernate.collection.Set类型,通过使用自定义集合类的实现,Hibernate实现了集合类型的延迟加载。为了 对集合类型使用延迟加载,我们必须如下配置我们的实体类的关于关联的部分:

<hibernate-mapping>

    <class name=”com.neusoft.entity.User” table=”user”>

…..

<set name=”addresses” table=”address” lazy=”true” inverse=”true”>

<key column=”user_id”/>

<one-to-many class=”com.neusoft.entity.Arrderss”/>

</set>

    </class>

</hibernate-mapping>

通过将<set>元素的lazy属性设置为true来开启集合类型的延迟加载特性。我们看下面的代码:

User user=(User)session.load(User.class,”1”);

Collection addset=user.getAddresses();       (1)

Iterator it=addset.iterator();                (2)

while(it.hasNext()){

Address address=(Address)it.next();

System.out.println(address.getAddress());

}

 

关于延迟加载的源码分析:

我没有深入,别人的链接:http://superleo.iteye.com/blog/243322/

 

延迟加载时代理模式的一种应用。

 

相关文章:

  • EventBus (四) Sticky事件
  • Centos6.6搭建中文版本的Cacti监控
  • 模拟停车POJ(3505)
  • 翻页效果
  • HDU 1162 prime+邻接矩阵
  • 特殊二维数组的查找
  • win8 开发之旅(19) --足球游戏揭秘6
  • linux下sed基本用法详解
  • [翻译] UPCardsCarousel
  • Java编程的逻辑 (1) - 数据和变量
  • ABP源码分析三十二:ABP.SignalR
  • office2003 安装步骤及注意事项
  • 我的屌丝giser成长记-研一篇(下)
  • 本周活动
  • MapReduce的过程(2)
  • hexo+github搭建个人博客
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【技术性】Search知识
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • ES6系列(二)变量的解构赋值
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • python 学习笔记 - Queue Pipes,进程间通讯
  • React系列之 Redux 架构模式
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Web Storage相关
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 技术胖1-4季视频复习— (看视频笔记)
  • 爬虫模拟登陆 SegmentFault
  • 前嗅ForeSpider中数据浏览界面介绍
  • 手机端车牌号码键盘的vue组件
  • 中文输入法与React文本输入框的问题与解决方案
  • 自制字幕遮挡器
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​如何防止网络攻击?
  • ​水经微图Web1.5.0版即将上线
  • # 飞书APP集成平台-数字化落地
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • $GOPATH/go.mod exists but should not goland
  • ( 10 )MySQL中的外键
  • (Forward) Music Player: From UI Proposal to Code
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (Oracle)SQL优化技巧(一):分页查询
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)Scala的“=”符号简介
  • (转)为C# Windows服务添加安装程序
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .Net MVC4 上传大文件,并保存表单