Hibernate懒加载之<class>标签上的lazy

lazy的概念:在真正使用某个对象的时候才去加载该对象。

Hibernate的lazy策略可以使用在:

1.<class>标签上,可以取值:true/false。

2.<property>标签上,可以取值:true/false,需要类增强工具,对字节码进行修改(这个没多大意义)。

3.<set>和<list>标签上,可以取值:true/false/extra。

4.<many-to-one>和<one-to-one>单端关联标签上,可以取值:false/proxy/noproxy


下面我们来体会一下在class标签上的lazy:

User.java:

public class User {

	/* ID */
	private int id;
	/* 用户名 */
	private String name;
	/* 用户密码 */
	private String password;
	/* 创建时间 */
	private Date createTime;

	//省略setter和getter方法
}

User.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- package表示实体类的包名 -->
<hibernate-mapping package="com.lixue.bean">
	<!-- class结点的name表示实体的类名,table表示实体映射到数据库中table的名称 -->
	<class name="User" table="t_user" lazy="true">
		<id name="id">
			<generator class="native" />
		</id>
		
		<!-- 映射普通属性 -->
		<property name="name" />
		<property name="password" />
		<property name="createTime" />

	</class>
</hibernate-mapping>

测试方法:

public void testLoad1(){
		
		/*获取User,load本身就支持延迟加载(class标签的lazy对普通属性有效)*/
		User user = (User) HibernateUtils.getSession().load(User.class, 1);
		
		/*不会发出sql(因为ID你查询的时候就已经指定了,没必要再去查)*/
		System.out.println("user.id=" + user.getId());
		
		/*会发出sql,因为此时真正要获取属性了,所以会发出sql语句,并且发出的语句查出了所有属性,后面的属性就不会发出语句了*/
		System.out.println("user.name=" + user.getName());
		
		/*不会发出sql(在查name的时候已经查出来了)*/
		System.out.println("user.password=" + user.getPassword());
		
		/*不会发出sql(在查name的时候就已经查出来了)*/
		System.out.println("user.createTime=" + user.getCreateTime());
	}

在User user = (User) HibernateUtils.getSession().load(User.class, 1);处打一个断点进行测试!


对象会出现在对象user-->handler--->target结点中,如图:


1.最开始target为null,当执行了user.getId()的时候,依然为null,因为ID在我们查询的时候就已经指定了,此时去查询就没什么意义。

2.执行user.getName()的时候就发出了一条语句,如图:


从图中,我们可以看出,查询ID的时候,并没有发出语句,这个我们刚才已经讲了,当我们查询name属性的时候,就发了一条语句,并且这条语句的功能是查询所有的属性。

3.当执行user.getPassword()和user.getCreateTime()的时候,就已经不会发出语句了,因为之前已经查询出了属性值。

注:<class>标签上的lazy,只支持普通属性,不会影响类中集合的加载。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值