延迟加载在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",就可以了