java lazy loading_Hibernate延迟加载 lazy loading

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值