Hibernate检索策略之延迟加载和立即加载



延迟加载:延迟加载(lazy load懒加载)是当在真正需要数据时,才执行SQL语句进行查询。避免了无谓的性能开销。

延迟加载分类:

   1.类级别的查询策略

  2.一对多和多对多关联的查询策略

  3.多对一关联的查询策略



什么情况下使用延迟加载?

  如果程序加载一个对象的目的是为了访问它的属性,可以采用立即加载。如果程序加载一个持久化对象的目的是仅仅为了获得它的引用,可以采用延迟加载

如何配置延时加载?

  在Hibernate中通过对.hbm的lazy属性来赋值,不同位置出现lazy的作用和取值也是不同的。

步骤如下:

1.类级别的查询策略:

  类级别可选的加载策略包括立即加载和延迟加载。默认为延迟加载。如果<class>元素的lazy属性为true。表示采用延迟加载;如果lazy属性为false,表示采用立即加载

  以Emp和Dept为例:

  在Dept.hbm.xml中的<Set>元素中添加属性 lazy="false" 表示立即加载

  测试类:

    @Test
    public void oneTest(){
        Dept dept=(Dept)session.load(Dept.class, 1);
        //lazy  true/false  类级别
        System.out.println(dept.getDeptName());

load()方法在Id属性和getClass(),都已经储存到内存中,不用请求数据库,其他属性都需请求。



2.一对多和多对多关联的查询策略

  如果对象中存在其他实体的集合则需要在hbm文件中配置set元素来进行表间的映射,而 在set元素中也可以添加lazy强延时加载。

  set元素中lazy有三个值,false(非延时加载),true(延时加载),extra(加强延时加载)。

    区别:这个策略能在进一步的帮我延迟加载这个对象,也就是代理对象的初始化时机。

  测试类:

设定lazy属性为extra,实现效果:

解析:第一条sql到数据库进行检索部门信息,随即加载出Dept对象

   第二条sql进行一个员工总记录获取,并没有加载Emp对象,他和lazy为true加载的时机不同。



3.多对一关联的查询策略

<many-to-one>元素用来设置多对一关联关系。lazy属性: 默认值为proxy,proxy:延迟加载no-proxy:无代理延迟加载false:立即加载。

测试类:

设定lazy为proxy,运行结果为:



总结:

Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。hibernate通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能。Hibernate 的延迟加载(lazy load)本质上就是代理模式的应用。



Hibernate检索策略之延迟加载和立即加载

时间: 2024-10-27 07:34:38

Hibernate检索策略之延迟加载和立即加载的相关文章

Hibernate 检索策略之延迟加载和立即加载

我们或多或少会听说过延迟加载这个名词,但是今天我们来深入的了解它的用处以及分类  首先呢,我们先来说一下它的定义: 延迟加载(lazy load懒加载)是当在真正需要数据(调用真正的属性和方法来处理数据时)时,才执行SQL语句进行查询.避免了无谓的性能开销. 延迟加载分类: 01.类级别的查询策略 02.一对多和多对多关联的查询策略 03.多对一关联的查询策略 Lazy:决定关联对象初始化时机 1.类级别的默认加载策略是延迟加载 以下两种方式都表示采用延迟加载策略 举例:<class name=

Hibernate检索策略与检索方式

hibernate的Session在加载Java对象时,一般都会把鱼这个对象相关联的其他Java对象也都加载到缓存中,以方便程序的调用.但很多情况下,我们不需要加载太多无用的对象到缓存中,一来会占用大量的内存,二来会增加数据库的访问次数,使得程序的运行效率降低.为了合理的使用缓存,Hibernate提供了不同的检索策略来解决这些问题. 作用域 在说检索策略之前,先了解一下检索策略的作用域,它分为:类级别和关联级别.类级别的作用域在检索数据时,检索的数据只包含一个类对象,不涉及与该类关联的其他对象

hibernate检索策略(抓取策略)

检索策略 类级别检索 默认检索策略:默认延迟加载, 可以使用lazy属性来进行改变. session.get(clazz,object)默认立即加载 @Test //测试左外连接查询 public void test13(){ Session session = HibernateUtils.getSession(); Transaction bt = session.beginTransaction(); Customer customer = session.get(Customer.cla

Hibernate —— 检索策略

一.Hibernate 的检索策略本质上是为了优化 Hibernate 性能. 二.Hibernate 检索策略包括类级别的检索策略.和关联级别的检索策略(<set> 元素) 三.类级别的检索策略 1. 立即检索.延迟检索 2. 通过 <class> 节点的 lazy 属性来控制.默认为 true,即为延迟检索. 3. 只针对 session 的 load() 方法生效. 默认情况下,通过 load() 方法获取到的对象是一个代理对象,Hibernate 创建代理对象时,仅会初始化

NHibernate 延迟加载与立即加载 (第七篇)

NHibernate 延迟加载与立即加载 (第七篇) 一.延迟加载 延迟加载可以理解为:当需要用的时候才加载. 假设我们数据库有一个Person对象,一个Country对象,其中Person属于Country,一对多关系.当我们Get()一个 Person对象的时候.并不立即把Country对象也加入来,而是当我们的代码执行到要通过Person调用Country对象的时 候,NHibernate才到数据库去查询对应的Country对象,这就叫延迟加载.相反,如果我们Get()一个Person对象

分享:“延迟加载与预加载”使用体会

注:文章以Linq to Entities 讲解 接触mvc+ef开发一年时间左右了,之前一直处于使用状态,对ef里面的一些概念并没有太多的研究,在解决问题的过程中有些疑问一直逗留在脑海中,现在稍微可以空下来查查资料并整理下了. 什么是"延迟加载"和"预加载"?听上去好像很拽的样子. 延迟加载: 老大最初给我的解释--"当使用到的时候才去加载,比如:ToList().ToDictionary()的时候",自己也简单的百度过一下,做过一些简单的测试

hibernate(八) Hibernate检索策略(类级别,关联级别,批量检索)详解

序言 很多看起来很难的东西其实并不难,关键是看自己是否花费了时间和精力去看,如果一个东西你能看得懂,同样的,别人也能看得懂,体现不出和别人的差距,所以当你觉得自己看了很多书或者学了很多东西的时候,你要想想,你花费的也就那么一点时间,别人花你这么多时间也能够学到你所学到的东西,所以还是要继续努力.既然不是天才,唯有靠勤奋来弥补. --WH 一.概述 检索策略分三大块,类级别检索策略和关联级别检测策略. 类级别检索策略:get.load. 关联级别检索策略:order.getCustomer().g

Hibernate 检索策略

概述 检索数据时的 2 个问题: –不浪费内存:当 Hibernate 从数据库中加载 Customer 对象时, 如果同时加载所有关联的 Order 对象, 而程序实际上仅仅需要访问 Customer 对象, 那么这些关联的 Order 对象就白白浪费了许多内存. –更高的查询效率:发送尽可能少的 SQL 语句 类级别的检索策略 •类级别可选的检索策略包括立即检索和延迟检索, 默认为延迟检索 –立即检索: 立即加载检索方法指定的对象 –延迟检索: 延迟加载检索方法指定的对象.在使用具体的属性时

[原创]java WEB学习笔记88:Hibernate学习之路-- -Hibernate检索策略(立即检索,延迟检索,迫切左外连接检索)

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------