Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Hibernate延迟加载 lazy loading

Hibernate延迟加载 lazy loading

作者头像
Hongten
发布于 2018-09-18 01:47:11
发布于 2018-09-18 01:47:11
1.1K0
举报
文章被收录于专栏:HongtenHongten

延迟加载在Hibernate中是默认延迟加载;

测试代码一:

HibernateTest.java

代码:

/**  *  */ package com.b510.examples;

import java.util.Set;

import org.hibernate.Session;

/**  *  * @author XHW  *  * @date 2011-7-18  *  */ public class HibernateTest {  public static void main(String[] args) {   new HibernateTest().update();  }  public void update(){   Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();   session.beginTransaction();  Category category=(Category)session.get(Category.class, 1);   System.out.println("id:"+category.getId()+"  ,name:"+category.getName()+", description:"+category.getDescription());   Set<Product> products=category.getProducts();   session.getTransaction().commit();    } }

运行结果:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate:     select         category0_.id as id1_0_,         category0_.name as name1_0_,         category0_.description as descript3_1_0_     from         users.category category0_     where         category0_.id=? id:1  ,name:java, description:java好啊

这里我们看到我们关心的是id,name和description属性,

虽然有:  Set<Product> products=category.getProducts(); 代码,即:不处理集合对象。但是我们只要的是:

  System.out.println("id:"+category.getId()+"  ,name:"+category.getName()+", description:"+category.getDescription()); 输出的是id,name和description属性值,其他的我们不管,所以Hibernate用了lazy loading(延迟加载),带来的好处就是我们不关心的

数据,不用现在加载,当我们要用的时候,才去加载

测试代码二:

HibernateTest.java

代码:

/**  *  */ package com.b510.examples;

import java.util.Set;

import org.hibernate.Session;

/**  *  * @author XHW  *  * @date 2011-7-18  *  */ public class HibernateTest {  public static void main(String[] args) {   new HibernateTest().update();  }  public void update(){   Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();   session.beginTransaction();   Category category=(Category)session.get(Category.class, 1);   System.out.println("id:"+category.getId()+"  ,name:"+category.getName()+", description:"+category.getDescription());   Set<Product> products=category.getProducts();   for(Product product:products){    System.out.println("ID:  "+product.getId()+"  name:"+product.getName()+" price: "+product.getPrice());   }     session.getTransaction().commit();    } }

运行效果:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate:     select         category0_.id as id1_0_,         category0_.name as name1_0_,         category0_.description as descript3_1_0_     from         users.category category0_     where         category0_.id=? id:1  ,name:java, description:java好啊 Hibernate:  select         products0_.category_id as category2_1_,         products0_.id as id1_,         products0_.id as id0_0_,         products0_.category_id as category2_0_0_,         products0_.name as name0_0_,         products0_.price as price0_0_,         products0_.descripton as descripton0_0_     from         users.product products0_     where         products0_.category_id=? ID:  1  name:java SE应用程序设计 price: 78.00 这里可以明确的告诉我们,当我们要加载Set集合的时候,这时候才去加载,而上面的例子,说明的是我们不加载的时候

Hibernate就延迟加载

取消延迟加载:

Category.hbm.xml

代码:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!--     Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping>     <class name="com.b510.examples.Category" table="category" catalog="users">         <id name="id" type="java.lang.Integer">             <column name="id" />             <generator class="increment" />         </id>         <property name="name" type="java.lang.String">             <column name="name" length="500" />         </property>         <property name="description" type="java.lang.String">             <column name="description" length="500" />         </property>         <set name="products" inverse="true" lazy="false">             <key>                 <column name="category_id" />             </key>             <one-to-many class="com.b510.examples.Product" />         </set>     </class> </hibernate-mapping>

测试代码:

HIbernateTest.java

代码:

/**  *  */ package com.b510.examples;

import java.util.Set;

import org.hibernate.Session;

/**  *  * @author XHW  *  * @date 2011-7-18  *  */ public class HibernateTest {  public static void main(String[] args) {   new HibernateTest().update();  }  public void update(){   Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();   session.beginTransaction();   Category category=(Category)session.get(Category.class, 1);   System.out.println("id:"+category.getId()+"  ,name:"+category.getName()+", description:"+category.getDescription());   Set<Product> products=category.getProducts();   session.getTransaction().commit();    } }

运行效果:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate:     select         category0_.id as id1_0_,         category0_.name as name1_0_,         category0_.description as descript3_1_0_     from         users.category category0_     where         category0_.id=? Hibernate:     select         products0_.category_id as category2_1_,         products0_.id as id1_,         products0_.id as id0_0_,         products0_.category_id as category2_0_0_,         products0_.name as name0_0_,         products0_.price as price0_0_,         products0_.descripton as descripton0_0_     from         users.product products0_     where         products0_.category_id=? id:1  ,name:java, description:java好啊 和测试代码一的运行结果相互比较,我们会发现,这次运行结果用了两条select语句。但是我们会发现

第二条select语句,对于我们的需求是没有必要的,他只有一个用处就是占用我们的程序执行时间。当然,

这是我们不希望看到的结果。

一般情况下,Hibernate会默认给我们设置延迟加载。lazy="true" ,这样会提升我们的系统性能,所以一般情况下,我们不会去

设置lazy="false",当然在特殊的情况下,我们必须要取消延迟加载的时候,我们就把lazy="false",就可以了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2011-07-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hibernate 中集合对象的抓取策略(Fetching strategies)
/**  * Product entity. @author MyEclipse Persistence Tools  */
Hongten
2018/09/18
4280
Hibernate二级缓存存集合对象
新建java project项目:chapter17_setehcache hibernate.cfg.xml 代码: <?xml version='1.0' encoding='UTF-8'?> <
Hongten
2018/09/13
6780
Hibernate Annotation (Hibernate 注解)
英文:http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/
Hongten
2018/09/18
1.4K0
Hibernate中的一级缓存
在一个会话的生命期里面,他所用到的数据会使用缓冲的,第一次读的是编号为2的数据记录
Hongten
2018/09/18
4720
HIbernate的“1+N”问题
import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction;
Hongten
2018/09/18
5650
Hibernate的二级缓存
/**  *  * @author XHW  *  * @date 2011-7-15  *  */ public class HibernateTest {
Hongten
2018/09/18
4890
Hibernate 中继承映射之三 每一个类一个表
mail:id,redipient,phone,address,postcode             <id><pk>
Hongten
2018/09/18
4140
Hibernate的性能优化之 dynamic-update dynamic-insert
public class Guestbook implements java.io.Serializable {
Hongten
2018/09/18
6930
悲观锁 HibernateTest.java
import org.hibernate.LockMode; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction;
Hongten
2018/09/18
4030
Hibernate中使用memcached
Hibernate-memcached是CacheProvider接口的memcached实现
Hongten
2018/09/13
6390
Hibernate 中继承映射之二 每个具体类一个表
在数据库中建立连个表:post_delivery和express_delivery
Hongten
2018/09/18
5070
Hibernate 过滤器
通过调用Session对象的setFilter()和enableFilter()方法使用过滤器。
Hongten
2018/09/18
5830
HQL 语句
import java.util.Iterator; import java.util.List; import java.util.Map;
Hongten
2018/09/18
8260
Hibernate 逆向工程生成POJO类和映射文件
public class Guestbook implements java.io.Serializable {
Hongten
2018/09/18
7870
hibernate延迟加载详解
hibernate延迟加载详解 Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能。 下面先来剖析 Hibernate 延迟加载的“秘密”。 集合属性的延迟加载 当 Hibernate 从数据库中初始化某个持久化实体时,该实体的集合属性是否随持久化类一起初始化呢?如果集合属性里包含十万,甚至百万的记录,在初始化持久化实体的同时,完成所有集合属性
Java帮帮
2018/03/19
1.5K0
hibernate延迟加载详解
使用拦截器实现审计日志
import org.apache.log4j.Logger; import org.hibernate.EmptyInterceptor; import org.hibernate.type.Type;
Hongten
2018/09/18
8440
HQL 查询语句
import java.util.Iterator; import java.util.List; import java.util.Map;
Hongten
2018/09/18
8980
java之hibernate之单向的一对多关联映射
1.在应用中,有时候需要从一的一端获取多的一端的数据。比如:查看某个分类下的所有书籍信息;查看某个订单下的所有商品等。
Vincent-yuan
2019/09/11
5420
java之hibernate之单向的一对多关联映射
Hibernate HQL 语句
import java.util.Iterator; import java.util.List; import java.util.Map;
Hongten
2018/09/18
6470
Hibernate之延迟加载
文章目录 1. hibernate之延迟加载 1.1. 什么是延迟加载 1.2. 好处 1.3. 如何使用延迟加载 1.4. 使用延迟加载需要注意的问题 hibernate之延迟加载 什么是延迟加载 在使用某些Hibernate方法查询数据的时候,Hibernate返回的只是一个空对象(除了id外属性都为null),并没有真正的查询数据库。而是在使用这个对象的时候才会出发查询数据,并将查询到的数据注入到这个空对象中,这种查询时机推迟到对象访问时的机制称之为延迟加载。 简单的说,使用延迟加载获取的对象,只
爱撒谎的男孩
2019/12/31
9720
相关推荐
Hibernate 中集合对象的抓取策略(Fetching strategies)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档