<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/hibernate-get-load-vs-html/</link>
<title><![CDATA[Hibernate中get和load方法的比较和区别]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Fri, 15 Oct 2010 07:59:53 +0000</pubDate> 
<guid>https://www.heckjj.com/hibernate-get-load-vs-html/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 微软雅黑;">这次我们来讨论一下Hibernate3.2 Session加载数据时get和load方法的区别，其实这个在网上有很多的论述，可大多语焉不详或经不起实践的推敲，让很多初学者学的满腹疑窦，现在我给大家讲解一下： <br/><br/>1. 对于get方法，hibernate会确认一下该id对应的数据是否存在，首先在session缓存中查找，然后在二级缓存中查找，还没有就查询数据库，数据库中没有就返回null。这个相对比较简单，也没有太大的争议。主要要说明的一点就是在这个版本中get方法也会查找二级缓存！<br/><br/>2.&nbsp;&nbsp;load方法加载实体对象的时候，根据映射文件上类级别的lazy属性的配置(默认为true)，分情况讨论： <br/><br/>(1)若为true,则首先在Session缓存中查找，看看该id对应的对象是否存在，不存在则使用延迟加载，返回实体的代理类对象(该代理类为实体类的子类，由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候，再查询二级缓存和数据库，若仍没发现符合条件的记录，则会抛出一个ObjectNotFoundException。 <br/><br/>(2)若为false,就跟get方法查找顺序一样，只是最终若没发现符合条件的记录，则会抛出一个ObjectNotFoundException。</span><span style="font-family: 微软雅黑;"><br/><br/>这里get和load有两个重要区别: <br/><br/>如果未能发现符合条件的记录，get方法返回null，而load方法会抛出一个ObjectNotFoundException。 <br/>load方法可返回没有加载实体数据的代理类实例，而get方法永远返回有实体数据的对象。(对于load和get方法返回类型：好多书中都说：“get方法永远只返回实体类”，实际上并不正确，get方法如果在session缓存中找到了该id对应的对象，如果刚好该对象前面是被代理过的，如被load方法使用过，或者被其他关联对象延迟加载过，那么返回的还是原先的代理对象，而不是实体类对象，如果该代理对象还没有加载实体数据（就是id以外的其他属性数据），那么它会查询二级缓存或者数据库来加载数据，但是返回的还是代理对象，只不过已经加载了实体数据。) <br/><br/>总之对于get和load的根本区别，一句话，hibernate对于load方法认为该数据在数据库中一定存在，可以放心的使用代理来延迟加载，如果在使用过程中发现了问题，只能抛异常；而对于get方法，hibernate一定要获取到真实的数据，否则返回null。 <br/><br/>最后，我们分析下为什么网路上那么多关于二者区别的文章不太准确！首先可能是版本问题，Hibernate版本不同，运行机制不太一样；其次就是很多朋友只是把自己经验所得与人分享，并没有经过全方位代码的检测；最后就是有些技术牛人，表达比较随意。所以我希望大家以后学习知识的时候不要盲从他人迷信权威，一定要综合多方资料，比较和整理，再经过自己实践检验，这样得到的知识才是真实有效的。 </span><br/>Tags - <a href="https://www.heckjj.com/tags/hibernate/" rel="tag">hibernate</a> , <a href="https://www.heckjj.com/tags/get/" rel="tag">get</a> , <a href="https://www.heckjj.com/tags/load/" rel="tag">load</a> , <a href="https://www.heckjj.com/tags/%25E6%2596%25B9%25E6%25B3%2595/" rel="tag">方法</a> , <a href="https://www.heckjj.com/tags/%25E5%258C%25BA%25E5%2588%25AB/" rel="tag">区别</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/hibernate-get-load-vs-html/#blogcomment</link>
<title><![CDATA[[评论] Hibernate中get和load方法的比较和区别]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/hibernate-get-load-vs-html/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>