導航

          <2009年8月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345
          統(tǒng)計
          • 隨筆 - 37
          • 文章 - 1
          • 評論 - 39
          • 引用 - 0

          常用鏈接

          留言簿(2)

          隨筆分類(25)

          隨筆檔案(37)

          文章檔案(1)

          相冊

          收藏夾(1)

          代碼

          搜索

          •  

          積分與排名

          • 積分 - 45098
          • 排名 - 1070

          最新評論

          閱讀排行榜

          評論排行榜

           

          Hibernate最讓人頭大的就是對集合的加載形式。
          書看了N次了,還是沒有真正理解Hibernate。所以下午專門做了下測試,對配置文件的意思加深了認識。

          假設有兩個表,Photos(一)? ---? picture(多)Photo包含picture集合

          結論1: HQL代碼 > fetch(配置) > lazy (配置)
          結論2: 默認 lazy="true"
          結論3: fetch 和 lazy 主要是用來級聯(lián)查詢的,?? 而 cascade 和 inverse 主要是用來級聯(lián)插入和修改的
          結論4: 如果你是用spring來幫你管理你的session, 并且是自動提交,延遲加載就等于沒加載~_~(當然
          ??????????????? 除非你手動重新打開session然后手動Hibernate.initialize(set);然后關閉session.
          結論5:?????cascade主要是簡化了在代碼中的級聯(lián)更新和刪除。
          j結論6:老爸可以有多個孩子,一個孩子不能有多個老爸,而且老爸說的算, 孩子圍著老爸轉(zhuǎn)。
          ???????????????所以Photos老爸要有權力所以 cascade?這個關鍵子都是送給老爸的,?也就是級聯(lián)更新,
          ?????????????? 老爸改姓了,兒子也得跟著改,呵呵。“不然,就沒有零花錢咯”。
          ??????????????? 而Picture兒子整體挨罵,但是還是要維護父子之間良好的關系,對老爸百依百順,所
          ?????????????? 以老爸就說,兒子,“關系,由你來維護(inverse="true")?,不然就不給零花錢。呵。”。
          ?????????????? <set name="pictures" inverse="true" cascade="all">
          ??????????????????? <key>
          ?????????????????????? <column name="photosid" not-null="true" />
          ??????????????????? </key>
          ???????????????? <one-to-many class="girl.domain.Picture" />
          ???????? ??? </set>
          ???????????????
          測試代碼:

          ???Photos p = ps.getById(1);
          ??Set<Picture> set = p.getPictures();
          ??for(Picture pic : set){
          ? ???System.out.println(pic.getId());
          ??}

          ? 配置文件的一部分:
          ?????? <set name="pictures" inverse="true" cascade="all" >
          ??????????? <key>
          ??????????????? <column name="photosid" not-null="true" />
          ??????????? </key>
          ??????????? <one-to-many class="girl.domain.Picture" />
          ??????? </set>

          測試過程會對配置文件不斷修改:并且從來不曾手動重新打開session

          測試結構:

          當配置條件為 lazy=true 一句查詢 測試代碼中沒有調(diào)用getPicture() ?正常
          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=?

          lazy=true 一句查詢 有getPicture()
          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=?


          lazy=true 一句查詢? 有getPicture() 并且訪問了里面的元數(shù)Picture 且有異常拋出
          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=?


          lazy="false" 兩句查詢? 肯定沒問題,因為全部數(shù)據(jù)都個查了出來 所以怎么調(diào)用都正常
          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=?
          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=?


          fetch="join"? 一句查詢? 效果 == lazy="false" 呵呵,哪個效率高,我就不知道了。。。。。。。。。。。
          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=?

          不加fetch="join" 一句查詢? 沒有getPicture() 正常
          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=?

          不加fetch="join" 一句查詢? 有getPicture() 正常
          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=?

          不加fetch="join" 一句查詢 有getPicture() 并且訪問里面的元素Picture的ID 有異常拋出
          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=?

          來個兩兵交戰(zhàn) fetch="join" lazy="true"? 呵呵 結果,一句查詢, 結構正常 所以就當lazy不存在好了。 看來fetch 是老大。、、、、、、、、、、、、、
          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=?

          posted on 2006-11-05 20:04 pear 閱讀(10154) 評論(2)  編輯  收藏 所屬分類: 心得體會Hibernate
          Comments
          • # re: 重新學習 Hibernate fetch lazy cascade inverse 關鍵字
            逗號
            Posted @ 2009-05-13 09:50
            pear 還是蠻風趣的。  回復  更多評論   
          • # re: 重新學習 Hibernate fetch lazy cascade inverse 關鍵字
            satitan
            Posted @ 2009-08-13 17:39
            還是感謝樓主,另外問一下,為啥有異常拋出,你的環(huán)境是怎樣的?沒有spring?請寫清楚點,博客至少讓別人能看懂。  回復  更多評論   
           
          主站蜘蛛池模板: 平凉市| 昌都县| 湘阴县| 嘉禾县| 太康县| 德安县| 玛多县| 肥城市| 岑溪市| 鸡泽县| 新余市| 烟台市| 萍乡市| 远安县| 正蓝旗| 扬州市| 建昌县| 松桃| 加查县| 沙雅县| 新兴县| 铅山县| 樟树市| 棋牌| 宁蒗| 波密县| 闽侯县| 综艺| 阳新县| 滦平县| 河南省| 赤水市| 鄂托克旗| 临夏市| 汉沽区| 海宁市| 南丰县| 余姚市| 蒙山县| 华安县| 顺昌县|