碰到的一個Hibernate的問題

          也不知道算不算問題,只是感覺有那么一點奇怪...
          在OSIV情況下編寫的一個測試類,其中的代碼是這樣的:
          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本身是個自關聯,映射文件如下:
          <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>

          因為是open session in view,所以session是在代碼執行完畢后關閉的;
          在這種情況下執行resultTest.getChilds()返回的是null。
          調試的時候dao.getById執行完畢后取回的resultTest和之前的test是同一個對象,hashcode都是一樣的..
          于是便嘗試在dao.getById之前把session關閉,這個時候再執行發現resultTest.getChilds()就是正確的了..
          總結,就是在同一個session內如果save了一個對象,再通過session.load的方式去取這個對象取出的將仍然是當前session中的對象,也就是說不會去數據庫中重新獲取...
          怎么感覺這樣是不太對的,明明數據庫有改變,卻沒有去重新的加載...
          但因為open session in view是這么做的,所以現在干脆測試的時候就使用另外一個dao了,唯一的不同就是這個dao會即時的關閉session,大家有沒有別的什么好建議,^_^

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

          評論

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

          ^_^,因為Session本身一級緩存,由于OSIV取的同一個session,所以是同一個對象。save(test)后,test已經從pojo轉變為po,任何po的改動都會同步到數據庫,但是代碼中僅僅是testChild.setParent(test),而沒有test.addChild(testChild),所以僅僅是testChild發生了變化,test沒有任何改動,session中仍然保存的是以前的test。重新開一個session會讀取會得到帶有child的test,或者用get()方法。  回復  更多評論   

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

          看一下它,對你有幫助,http://www.aygfsteel.com/asktalk/archive/2006/01/18/28548.html  回復  更多評論   

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

          恩,多謝asktalk,^_^  回復  更多評論   

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

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


            回復  更多評論   

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

          恩,已經這么做了,多謝,^_^  回復  更多評論   

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

          可以用session.refresh()進行強行讀取就OK了。
          我么項目的Category也是自影射,修改完以后child就沒有了。只要refresh一下就OK了。  回復  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導航

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

          統計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宜川县| 南丰县| 全州县| 清涧县| 福鼎市| 平安县| 红桥区| 扬中市| 永康市| 蛟河市| 吉首市| 东辽县| 乌鲁木齐县| 高阳县| 环江| 枝江市| 黔江区| 阿瓦提县| 西昌市| 天长市| 景洪市| 清苑县| 梁山县| 永宁县| 乌拉特前旗| 曲水县| 台北县| 宽甸| 临城县| 蒙城县| 漳州市| 上高县| 宝应县| 宿迁市| 睢宁县| 绥棱县| 抚松县| 元谋县| 桃江县| 宣城市| 新宾|