﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-pear-随笔分类-Hibernate</title><link>http://www.blogjava.net/pear/category/16599.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 17:47:35 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 17:47:35 GMT</pubDate><ttl>60</ttl><item><title>重新学习 Hibernate fetch lazy cascade inverse 关键字 </title><link>http://www.blogjava.net/pear/archive/2006/11/05/79251.html</link><dc:creator>pear</dc:creator><author>pear</author><pubDate>Sun, 05 Nov 2006 12:04:00 GMT</pubDate><guid>http://www.blogjava.net/pear/archive/2006/11/05/79251.html</guid><wfw:comment>http://www.blogjava.net/pear/comments/79251.html</wfw:comment><comments>http://www.blogjava.net/pear/archive/2006/11/05/79251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pear/comments/commentRss/79251.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pear/services/trackbacks/79251.html</trackback:ping><description><![CDATA[
		<p>Hibernate最让人头大的就是对集合的加载形式。<br />书看了N次了，还是没有真正理解Hibernate。所以下午专门做了下测试，对配置文件的意思加深了认识。<br /><br />假设有两个表，Photos(一）  ---  picture(多）Photo包含picture集合<br /><br />结论1： HQL代码 &gt; fetch（配置） &gt; lazy （配置）<br />结论2： 默认 lazy="true"<br />结论3： fetch 和 lazy 主要是用来级联查询的，   而 cascade 和 inverse 主要是用来级联插入和修改的<br />结论4： 如果你是用spring来帮你管理你的session, 并且是自动提交，延迟加载就等于没加载~_~(当然<br />                除非你手动重新打开session然后手动Hibernate.initialize(set);然后关闭session.<br />结论5:     cascade主要是简化了在代码中的级联更新和删除。<br />j结论6：老爸可以有多个孩子，一个孩子不能有多个老爸，而且老爸说的算, 孩子围着老爸转。<br />               所以Photos老爸要有权力所以 cascade 这个关键子都是送给老爸的， 也就是级联更新，<br />               老爸改姓了，儿子也得跟着改，呵呵。“不然，就没有零花钱咯”。<br />                而Picture儿子整体挨骂，但是还是要维护父子之间良好的关系，对老爸百依百顺，所<br />               以老爸就说，儿子，“关系，由你来维护（inverse="true") ，不然就不给零花钱。呵。”。<br />               &lt;set name="pictures" inverse="true" cascade="all"&gt;<br />                    &lt;key&gt;<br />                       &lt;column name="photosid" not-null="true" /&gt;<br />                    &lt;/key&gt;<br />                 &lt;one-to-many class="girl.domain.Picture" /&gt;<br />             &lt;/set&gt;<br />               <br />测试代码：<br /><br />   Photos p = ps.getById(1);<br />  Set&lt;Picture&gt; set = p.getPictures();<br />  for(Picture pic : set){<br />     System.out.println(pic.getId());<br />  }<br /><br />  配置文件的一部分：<br />       &lt;set name="pictures" inverse="true" cascade="all" &gt;<br />            &lt;key&gt;<br />                &lt;column name="photosid" not-null="true" /&gt;<br />            &lt;/key&gt;<br />            &lt;one-to-many class="girl.domain.Picture" /&gt;<br />        &lt;/set&gt;<br /><br />测试过程会对配置文件不断修改：并且从来不曾手动重新打开session<br /><br />测试结构：<br /><br />当配置条件为 lazy=true 一句查询 测试代码中没有调用getPicture()  正常 <br />Hibernate: select photos0_.id as id0_0_, photos0_.userid as userid0_0_, photos0_.typeid as typeid0_0_, photos0_.name as name0_0_, photos0_.createtime as createtime0_0_, photos0_.description as descript6_0_0_, photos0_.faceid as faceid0_0_, photos0_.uri as uri0_0_ from super.photos photos0_ where photos0_.id=?</p>
		<p>lazy=true 一句查询 有getPicture()<br />Hibernate: select photos0_.id as id0_0_, photos0_.userid as userid0_0_, photos0_.typeid as typeid0_0_, photos0_.name as name0_0_, photos0_.createtime as createtime0_0_, photos0_.description as descript6_0_0_, photos0_.faceid as faceid0_0_, photos0_.uri as uri0_0_ from super.photos photos0_ where photos0_.id=?</p>
		<p>
				<br />lazy=true 一句查询  有getPicture() 并且访问了里面的元数Picture 且有异常抛出<br />Hibernate: select photos0_.id as id0_0_, photos0_.userid as userid0_0_, photos0_.typeid as typeid0_0_, photos0_.name as name0_0_, photos0_.createtime as createtime0_0_, photos0_.description as descript6_0_0_, photos0_.faceid as faceid0_0_, photos0_.uri as uri0_0_ from super.photos photos0_ where photos0_.id=?</p>
		<p>
				<br />lazy="false" 两句查询  肯定没问题，因为全部数据都个查了出来 所以怎么调用都正常<br />Hibernate: select photos0_.id as id0_0_, photos0_.userid as userid0_0_, photos0_.typeid as typeid0_0_, photos0_.name as name0_0_, photos0_.createtime as createtime0_0_, photos0_.description as descript6_0_0_, photos0_.faceid as faceid0_0_, photos0_.uri as uri0_0_ from super.photos photos0_ where photos0_.id=?<br />Hibernate: select pictures0_.photosid as photosid1_, pictures0_.id as id1_, pictures0_.id as id2_0_, pictures0_.photosid as photosid2_0_, pictures0_.name as name2_0_, pictures0_.clicked as clicked2_0_, pictures0_.uploaddate as uploaddate2_0_, pictures0_.size as size2_0_, pictures0_.description as descript7_2_0_, pictures0_.uri as uri2_0_ from super.picture pictures0_ where pictures0_.photosid=?</p>
		<p>
				<br />fetch="join"  一句查询  效果 ＝＝ lazy="false" 呵呵，哪个效率高，我就不知道了。。。。。。。。。。。<br />Hibernate: select photos0_.id as id0_1_, photos0_.userid as userid0_1_, photos0_.typeid as typeid0_1_, photos0_.name as name0_1_, photos0_.createtime as createtime0_1_, photos0_.description as descript6_0_1_, photos0_.faceid as faceid0_1_, photos0_.uri as uri0_1_, pictures1_.photosid as photosid3_, pictures1_.id as id3_, pictures1_.id as id2_0_, pictures1_.photosid as photosid2_0_, pictures1_.name as name2_0_, pictures1_.clicked as clicked2_0_, pictures1_.uploaddate as uploaddate2_0_, pictures1_.size as size2_0_, pictures1_.description as descript7_2_0_, pictures1_.uri as uri2_0_ from super.photos photos0_ left outer join super.picture pictures1_ on photos0_.id=pictures1_.photosid where photos0_.id=?</p>
		<p>不加fetch＝"join" 一句查询  没有getPicture() 正常<br />Hibernate: select photos0_.id as id0_0_, photos0_.userid as userid0_0_, photos0_.typeid as typeid0_0_, photos0_.name as name0_0_, photos0_.createtime as createtime0_0_, photos0_.description as descript6_0_0_, photos0_.faceid as faceid0_0_, photos0_.uri as uri0_0_ from super.photos photos0_ where photos0_.id=?</p>
		<p>不加fetch＝"join" 一句查询  有getPicture() 正常<br />Hibernate: select photos0_.id as id0_0_, photos0_.userid as userid0_0_, photos0_.typeid as typeid0_0_, photos0_.name as name0_0_, photos0_.createtime as createtime0_0_, photos0_.description as descript6_0_0_, photos0_.faceid as faceid0_0_, photos0_.uri as uri0_0_ from super.photos photos0_ where photos0_.id=?</p>
		<p>不加fetch＝"join" 一句查询 有getPicture() 并且访问里面的元素Picture的ID 有异常抛出<br />Hibernate: select photos0_.id as id0_0_, photos0_.userid as userid0_0_, photos0_.typeid as typeid0_0_, photos0_.name as name0_0_, photos0_.createtime as createtime0_0_, photos0_.description as descript6_0_0_, photos0_.faceid as faceid0_0_, photos0_.uri as uri0_0_ from super.photos photos0_ where photos0_.id=?</p>
		<p>来个两兵交战 fetch="join" lazy="true"  呵呵 结果，一句查询， 结构正常 所以就当lazy不存在好了。 看来fetch 是老大。、、、、、、、、、、、、、<br />Hibernate: select photos0_.id as id0_1_, photos0_.userid as userid0_1_, photos0_.typeid as typeid0_1_, photos0_.name as name0_1_, photos0_.createtime as createtime0_1_, photos0_.description as descript6_0_1_, photos0_.faceid as faceid0_1_, photos0_.uri as uri0_1_, pictures1_.photosid as photosid3_, pictures1_.id as id3_, pictures1_.id as id2_0_, pictures1_.photosid as photosid2_0_, pictures1_.name as name2_0_, pictures1_.clicked as clicked2_0_, pictures1_.uploaddate as uploaddate2_0_, pictures1_.size as size2_0_, pictures1_.description as descript7_2_0_, pictures1_.uri as uri2_0_ from super.photos photos0_ left outer join super.picture pictures1_ on photos0_.id=pictures1_.photosid where photos0_.id=?</p>
<img src ="http://www.blogjava.net/pear/aggbug/79251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pear/" target="_blank">pear</a> 2006-11-05 20:04 <a href="http://www.blogjava.net/pear/archive/2006/11/05/79251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>