碰到的一個(gè)Hibernate的問題

          也不知道算不算問題,只是感覺有那么一點(diǎn)奇怪...
          在OSIV情況下編寫的一個(gè)測(cè)試類,其中的代碼是這樣的:
          1Test test=new Test();
          2dao.save(test);
          3Test testChild=new Test();
          4testChild.setParent(test);
          5dao.save(testChild);
          6Test resultTest=(Test)dao.getById(Test.class, test.getId());
          Test本身是個(gè)自關(guān)聯(lián),映射文件如下:
          <class
                 
          name="dataset.component.metadata.display.Test"
                 table
          ="T_Test"
                 dynamic-update
          ="true"
             
          >

                 
          <id
                     
          name="id"
                     column
          ="id"
                     type
          ="int"
                 
          >
                     
          <generator class="native">
                     
          </generator>
                 
          </id>

                 
          <set
                     
          name="childs"
                     table
          ="T_Test"
                     lazy
          ="true"
                     cascade
          ="delete"
                     sort
          ="unsorted"
                 
          >

                     
          <key
                         
          column="parentId"
                     
          >
                     
          </key>

                     
          <one-to-many
                           
          class="dataset.component.metadata.display.Test"
                     
          />

                 
          </set>

                 
          <many-to-one
                     
          name="parent"
                     class
          ="dataset.component.metadata.display.Test"
                     cascade
          ="none"
                     outer-join
          ="auto"
                     update
          ="true"
                     insert
          ="true"
                     column
          ="parentId"
                 
          />

             
          </class>

          因?yàn)槭莖pen session in view,所以session是在代碼執(zhí)行完畢后關(guān)閉的;
          在這種情況下執(zhí)行resultTest.getChilds()返回的是null。
          調(diào)試的時(shí)候dao.getById執(zhí)行完畢后取回的resultTest和之前的test是同一個(gè)對(duì)象,hashcode都是一樣的..
          于是便嘗試在dao.getById之前把session關(guān)閉,這個(gè)時(shí)候再執(zhí)行發(fā)現(xiàn)resultTest.getChilds()就是正確的了..
          總結(jié),就是在同一個(gè)session內(nèi)如果save了一個(gè)對(duì)象,再通過session.load的方式去取這個(gè)對(duì)象取出的將仍然是當(dāng)前session中的對(duì)象,也就是說不會(huì)去數(shù)據(jù)庫中重新獲取...
          怎么感覺這樣是不太對(duì)的,明明數(shù)據(jù)庫有改變,卻沒有去重新的加載...
          但因?yàn)閛pen session in view是這么做的,所以現(xiàn)在干脆測(cè)試的時(shí)候就使用另外一個(gè)dao了,唯一的不同就是這個(gè)dao會(huì)即時(shí)的關(guān)閉session,大家有沒有別的什么好建議,^_^

          posted on 2006-02-24 20:05 BlueDavy 閱讀(1716) 評(píng)論(6)  編輯  收藏 所屬分類: Java

          評(píng)論

          # re: 碰到的一個(gè)Hibernate的問題 2006-02-24 20:56 Vincent Thinking

          ^_^,因?yàn)镾ession本身一級(jí)緩存,由于OSIV取的同一個(gè)session,所以是同一個(gè)對(duì)象。save(test)后,test已經(jīng)從pojo轉(zhuǎn)變?yōu)閜o,任何po的改動(dòng)都會(huì)同步到數(shù)據(jù)庫,但是代碼中僅僅是testChild.setParent(test),而沒有test.addChild(testChild),所以僅僅是testChild發(fā)生了變化,test沒有任何改動(dòng),session中仍然保存的是以前的test。重新開一個(gè)session會(huì)讀取會(huì)得到帶有child的test,或者用get()方法。  回復(fù)  更多評(píng)論   

          # re: 碰到的一個(gè)Hibernate的問題 2006-02-26 10:07 Asktalk

          看一下它,對(duì)你有幫助,http://www.aygfsteel.com/asktalk/archive/2006/01/18/28548.html  回復(fù)  更多評(píng)論   

          # re: 碰到的一個(gè)Hibernate的問題 2006-02-26 16:45 BlueDavy

          恩,多謝asktalk,^_^  回復(fù)  更多評(píng)論   

          # re: 碰到的一個(gè)Hibernate的問題 2006-02-28 08:20 aycl

          在 dao.getById(..) 前叫: session.clear() 或 session.evict(test). 可清理一級(jí)緩存, 迫 hibernate 重新讀取.


            回復(fù)  更多評(píng)論   

          # re: 碰到的一個(gè)Hibernate的問題 2006-02-28 09:27 BlueDavy

          恩,已經(jīng)這么做了,多謝,^_^  回復(fù)  更多評(píng)論   

          # re: 碰到的一個(gè)Hibernate的問題 2006-03-10 13:47 Tin

          可以用session.refresh()進(jìn)行強(qiáng)行讀取就OK了。
          我么項(xiàng)目的Category也是自影射,修改完以后child就沒有了。只要refresh一下就OK了。  回復(fù)  更多評(píng)論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導(dǎo)航

          <2006年2月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627281234
          567891011

          統(tǒng)計(jì)

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 阿合奇县| 黑河市| 泉州市| 子长县| 博白县| 长岛县| 安康市| 桐乡市| 淄博市| 会昌县| 沾化县| 张掖市| 镇安县| 修文县| 延川县| 隆昌县| 惠东县| 柘荣县| 禹州市| 虹口区| 静宁县| 连州市| 常熟市| 延安市| 滕州市| 荃湾区| 灵宝市| 和硕县| 临江市| 勐海县| 二手房| 中山市| 大埔区| 尚志市| 小金县| 神木县| 阿合奇县| 休宁县| 始兴县| 阳山县| 连州市|