延迟加载在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",就可以了
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有