博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hibernate中get 与 load 区别
阅读量:4069 次
发布时间:2019-05-25

本文共 5312 字,大约阅读时间需要 17 分钟。

<p><span class="hilite2">session</span>.get 与 <span class="hilite2">session</span>.<span class="hilite3">load</span>区别 <br>1. 对于get方法,<span class="hilite1">hibernate</span>会确认一下该id对应的数据是否存在,首先在<span class="hilite2">session</span>缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null。 <br><br>2. <span class="hilite3">load</span>方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论: <br><br>(1)若为true,则首先在<span class="hilite2">Session</span>缓存中查找,看看该id对应的对象是否 存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候, 再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个ObjectNotFoundException。 <br><br>(2)若为false,就跟get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。 <br><br>这里get和<span class="hilite3">load</span>有两个重要区别: <br><br>如果未能发现符合条件的记录,get方法返回null,而<span class="hilite3">load</span>方法会抛出一个ObjectNotFoundException。 <br><span class="hilite3">load</span>方法可返回没有加载实体数据的代理类实例,而get方法永远返回有实体数据的对象。(对于<span class="hilite3">load</span>和get方法返回类型:好多书中都说:“get方法永远只返回实体类”,实际上并不正确,get方法如果在<span class="hilite2">session</span>缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被<span class="hilite3">load</span>方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。)</p>
<p></p>
<p>以下是代码实例:</p>
<p>Category.hbm.xml:</p>
<p></p>
<p><hibernate-mapping package="cn.itcast.bbs.entities"><br><class name="Category" table="itcast_category" <span style="color: #ff0000;">lazy="false"</span> ><<<<<<<<<<<<<<1.</p>
<p><id name="id" ><br><column name="ID_" unique="true"></column><br><generator class="native"></generator><br></id></p>
<p><property name="name" column="NAME_"></property></p>
<p> <property name="desc" column="DESC_"></property><br><property name="order" column="ORDER_"></property></p>
<p><set name="forums" order-by="ORDER_ ASC" <span style="color: #ff0000;">lazy="true"</span> ><<<<<<<<<<<<<<<<2.<br><key column="CATEGORY_"></key><br><one-to-many class="Forum" /><br></set><br></class><br></hibernate-mapping></p>
<p></p>
<p>DaoImpl:</p>
<p>public Category get(int id) {<br>return (Category) getSession().get(Category.clazz, id);<br>}</p>
<p>public T load(int id) {<br>return Category) getSession().load(Category.clazz, id);<br>}</p>
<p></p>
<p><span style="color: #ff0000;">1.情况如下时</span></p>
<p>junit:</p>
<p>private CategoryDao categoryDao = new CategoryDaoImpl();</p>
<p>public void testGet(){<br>Session session = HibernateSessionFactory.getSession();<br>session.beginTransaction();<br><span style="color: #ff0000;">Category c = categoryDao.load(2);</span><br><br>//System.out.println(c.getId() + ", " + c.getName());<<<<<<<3.</p>
<p>//System.out.println( c.getForums());<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4.<br>session.getTransaction().commit();<br>session.close();<br>}</p>
<p></p>
<p><span style="color: #ff0000;">a. 1.lazy="false" 2.<span style="color: #ff0000;">lazy="true" 时:</span></span></p>
<p>Console:</p>
<p>Hibernate: select category0_.ID_ as ID1_0_0_, category0_.NAME_ as NAME2_0_0_, category0_.DESC_ as DESC3_0_0_, category0_.ORDER_ as ORDER4_0_0_ from itcast_category category0_ where category0_.ID_=?</p>
<p><span style="color: #ff0000;"> 打开注释3时</span></p>
<p>Console:</p>
<p>Hibernate: select category0_.ID_ as ID1_0_0_, category0_.NAME_ as NAME2_0_0_, category0_.DESC_ as DESC3_0_0_, category0_.ORDER_ as ORDER4_0_0_ from itcast_category category0_ where category0_.ID_=?<br>2, b</p>
<p><span style="color: #ff0000;"> 打开注释4时</span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">Console:</span></span></p>
<p>Hibernate: select category0_.ID_ as ID1_0_0_, category0_.NAME_ as NAME2_0_0_, category0_.DESC_ as DESC3_0_0_, category0_.ORDER_ as ORDER4_0_0_ from itcast_category category0_ where category0_.ID_=?<br>2, b<br>Hibernate: select forums0_.CATEGORY_ as CATEGORY5_1_, forums0_.ID_ as ID1_1_, forums0_.ID_ as ID1_1_0_, forums0_.NAME_ as NAME2_1_0_, forums0_.DESC_ as DESC3_1_0_, forums0_.ORDER_ as ORDER4_1_0_, forums0_.CATEGORY_ as CATEGORY5_1_0_ from itcast_forum forums0_ where forums0_.CATEGORY_=? order by forums0_.ORDER_ ASC<br>[id=2,name=b1,order=2, id=3,name=b2,order=3]</p>
<p><span style="color: #ff0000;">b. 1.lazy="true" 2.<span style="color: #ff0000;">lazy="true" 时:</span></span><br>Console:</p>
<p></p>
<p><span style="color: #ff0000;"> 打开注释3时</span></p>
<p>Console:</p>
<p>Hibernate: select category0_.ID_ as ID1_0_0_, category0_.NAME_ as NAME2_0_0_, category0_.DESC_ as DESC3_0_0_, category0_.ORDER_ as ORDER4_0_0_ from itcast_category category0_ where category0_.ID_=?<br>2, b</p>
<p></p>
<p><span style="color: #ff0000;"> 打开注释4时</span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">Console:</span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">Hibernate: select category0_.ID_ as ID1_0_0_, category0_.NAME_ as NAME2_0_0_, category0_.DESC_ as DESC3_0_0_, category0_.ORDER_ as ORDER4_0_0_ from itcast_category category0_ where category0_.ID_=?<br>2, b<br>Hibernate: select forums0_.CATEGORY_ as CATEGORY5_1_, forums0_.ID_ as ID1_1_, forums0_.ID_ as ID1_1_0_, forums0_.NAME_ as NAME2_1_0_, forums0_.DESC_ as DESC3_1_0_, forums0_.ORDER_ as ORDER4_1_0_, forums0_.CATEGORY_ as CATEGORY5_1_0_ from itcast_forum forums0_ where forums0_.CATEGORY_=? order by forums0_.ORDER_ ASC<br>[id=2,name=b1,order=2, id=3,name=b2,order=3] </span></span></p>
<p>更多示例,请大家自行测试,这里就不赘述了</p>

转载地址:http://jdaji.baihongyu.com/

你可能感兴趣的文章
简单理解Socket及TCP/IP、Http、Socket的区别
查看>>
利用HTTP Cache来优化网站
查看>>
利用负载均衡优化和加速HTTP应用
查看>>
消息队列设计精要
查看>>
分布式缓存负载均衡负载均衡的缓存处理:虚拟节点对一致性hash的改进
查看>>
分布式存储系统设计(1)—— 系统架构
查看>>
MySQL数据库的高可用方案总结
查看>>
常用排序算法总结(一) 比较算法总结
查看>>
SSH原理与运用
查看>>
SIGN UP BEC2
查看>>
S3C2440中对LED驱动电路的理解
查看>>
《天亮了》韩红
查看>>
Windows CE下USB摄像头驱动开发(以OV511为例,附带全部源代码以及讲解) [转]
查看>>
出现( linker command failed with exit code 1)错误总结
查看>>
iOS开发中一些常见的并行处理
查看>>
iOS获取手机的Mac地址
查看>>
ios7.1发布企业证书测试包的问题
查看>>
如何自定义iOS中的控件
查看>>
iOS 开发百问
查看>>
Mac环境下svn的使用
查看>>