本文研究的主要是
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结点中,如图:
1.最开始target为null,当执行了user.getid()
的时候,依然为null,因为id在我们查询的时候就已经指定了,此时去查询就没什么意义。
2.执行user.getname()
的时候就发出了一条语句,如图:
从图中,我们可以看出,查询id的时候,并没有发出语句,这个我们刚才已经讲了,当我们查询name属性的时候,就发了一条语句,并且这条语句的功能是查询所有的属性。
3.当执行user.getpassword()
和user.getcreatetime()
的时候,就已经不会发出语句了,因为之前已经查询出了属性值。
注:<class>标签上的lazy,只支持普通属性,不会影响类中集合的加载。
总结
以上就是本文关于hibernate懒加载之<class>标签上的lazy的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:http://blog.csdn.net/lzm1340458776/article/details/33357851