延迟加载在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 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 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 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
代码:
/p>
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
测试代码:
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 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",就可以了