本文研究的主要是
<强>懒惰的概念强>:在真正使用某个对象的时候才去加载该对象。
Hibernate的懒惰策略可以使用在:
1。你们;class>标签上,可以取值:true/false。
2。你们;property>标签上,可以取值:true/false,需要类增强工具,对字节码进行修改(这个没多大意义)。
3灵活;set>和& lt; list>标签上,可以取值:true/false/额外。
4灵活;many-to-one>和& lt; one-to-one>单端关联标签上,可以取值:false/代理/noproxy
下面我们来体会一下在课标签上的懒惰:
<强> User.java: 强>
公开课用户{ *//* ID 私人int id;/*用户名*/私人字符串名称;/*用户密码*/私人密码字符串;/*创建时间*/私人createTime日期;//省略setter和getter方法 }
<强> User.hbm.xml: 强>
& lt; & # 63; xml version=" 1.0 " & # 63;比; & lt; !DOCTYPE hibernate映射公共 ”——//Hibernate/Hibernate映射3.0 DTD//EN " “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”在 & lt; !——包表示实体类的包名——比; & lt; hibernate映射包=癱om.lixue.bean”比; & lt; !——类结点的名字表示实体的类名,表表示实体映射到数据库表的中名称——比; & lt;类名="用户"表=皌_user”懒=" true "比; & lt; id name=" id "比; & lt;生成器类=氨镜亍?比; & lt;/id> & lt; !——映射普通属性——比; & lt;属性名="名称"/比; & lt;属性名="密码"/比; & lt;属性名=" createTime "/比; & lt;/class> & lt;/hibernate-mapping>>之前<强>测试方法:强>
公共空间testLoad1 () {/*获取用户负载本身就支持延迟加载(类标签的懒惰对普通属性有效)*/用户用户=(用户)HibernateUtils.getSession () .load(用户。类,1);/*不会发出sql(因为ID你查询的时候就已经指定了,没必要再去查)*/System.out.println(“用户。id=" + user.getId ());/*会发出sql,因为此时真正要获取属性了,所以会发出sql语句,并且发出的语句查出了所有属性,后面的属性就不会发出语句了*/System.out.println (" user.name=" + user.getName ());/*不会发出sql(在查名字的时候已经查出来了)*/System.out.println(“用户。密码=" + user.getPassword ());/*不会发出sql(在查名字的时候就已经查出来了)*/System.out.println(“用户。createTime=" + user.getCreateTime ()); }在<代码>用户用户=(用户)HibernateUtils.getSession () .load(用户。类,1),代码>处打一个断点进行测试!
对象会出现在对象用户——在处理程序——→目标结点中,如图:
1。最开始目标为零,当执行了<代码> user.getId() 代码>的时候,依然为null,因为ID在我们查询的时候就已经指定了,此时去查询就没什么意义。
2。执行<代码> user.getName() 代码>的时候就发出了一条语句,如图:
从图中,我们可以看的出,查询ID的时候,并没有发出语句,这个我们刚才已经讲了,当我们查询名称属性的时候,就发了一条语句,并且这条语句的功能是查询所有的属性。
3。当执行<代码> user.getPassword() 代码>和<代码> user.getCreateTime() 代码>的时候,就已经不会发出语句了,因为之前已经查询出了属性值。
注:& lt; class>标签上的懒惰,只支持普通属性,不会影响类中集合的加载。
总结
以上就是本文关于Hibernate懒加载之& lt; class>标签上的懒惰的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
Hibernate懒加载之& lt; class>标签上的懒惰