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

2025-05-29 0 100

本文研究的主要是

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:

?

1

2

3

4

5

6

7

8

9

10

11
public class user {

/* id */

private int id;

/* 用户名 */

private string name;

/* 用户密码 */

private string password;

/* 创建时间 */

private date createtime;

//省略setter和getter方法

}

user.hbm.xml:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
<?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>

测试方法:

?

1

2

3

4

5

6

7

8

9

10

11

12
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结点中,如图:

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

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

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

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

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

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

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

总结

以上就是本文关于hibernate懒加载之<class>标签上的lazy的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

原文链接:http://blog.csdn.net/lzm1340458776/article/details/33357851

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Hibernate懒加载之<class>标签上的lazy https://www.kuaiidc.com/112659.html

相关文章

发表评论
暂无评论