追隨Java
          簡(jiǎn)單的事情重復(fù)做,就會(huì)產(chǎn)生累積效應(yīng)!
          posts - 260,  comments - 338,  trackbacks - 0
            用hibernate作為持久層,update是出現(xiàn)了重復(fù)記錄。奇怪了,為什么會(huì)明明是update,怎么可能出現(xiàn)添加一條記錄的結(jié)果呢?
          由于在操作過(guò)程中,修改了某個(gè)屬性(字段),可以u(píng)pdate成功。但我在頁(yè)面中的另一個(gè)屬性(它有一個(gè)回車(chē)操作去從數(shù)據(jù)庫(kù)拿另外的數(shù)據(jù)來(lái)更新)中修改,就會(huì)出現(xiàn)添加一個(gè)新的記錄。WHY?   
            我仔細(xì)看了一下日志,兩個(gè)不同的操作sql真不一樣,一個(gè)是用insert,另一個(gè)是用update語(yǔ)句。反過(guò)來(lái)的想了想有關(guān)pojo相等的比較原理。
            我于是有了幾個(gè)想法,來(lái)測(cè)試。
            1)兩個(gè)對(duì)象的比較(equals)規(guī)則的可能出錯(cuò)了。
              在我記憶中,pojo對(duì)象默認(rèn)的equals方法是用主鍵來(lái)認(rèn)識(shí),兩個(gè)對(duì)象是否相等。以前沒(méi)有重寫(xiě)equlas方法和hashCode方法。對(duì)于不是很熟悉hibernate的我來(lái)說(shuō),還是決定重寫(xiě)這兩個(gè)方法。編譯完,重啟tomcate,問(wèn)題依舊。
                  2) 是不是我在持久層調(diào)用方法出錯(cuò)了呢?
             仔細(xì)看了一下saveOrUpdate()這個(gè)方法的文檔。saveOrUpdate方法能通過(guò)現(xiàn)個(gè)對(duì)象的equals方法來(lái)區(qū)分,到底是要insert還是要update。看來(lái)這個(gè)應(yīng)該沒(méi)有問(wèn)題。
            3)經(jīng)過(guò)上面兩步的推理。難道是要修改對(duì)象的關(guān)鍵字的值被漏掉了嗎?
             我追蹤了主鍵值,由于主鍵值在頁(yè)面是在一個(gè)隱藏域。當(dāng)操作出錯(cuò)屬性(它有一個(gè)回車(chē)操作去從數(shù)據(jù)庫(kù)拿另外的數(shù)據(jù)來(lái)更新)返回時(shí),查看了頁(yè)面的源代碼,果然,隱藏域的值為空。原來(lái)在我返回頁(yè)面時(shí),忘記給它保存原來(lái)的值了。
            經(jīng)過(guò)一番折騰,終于搞定了。:)
            在編碼過(guò)程中一定要仔細(xì),嚴(yán)謹(jǐn),平時(shí)多注意理論知識(shí)的積累,理論聯(lián)系實(shí)踐。
             

              

               
          posted on 2005-09-07 14:22 Harryson 閱讀(6190) 評(píng)論(5)  編輯  收藏 所屬分類(lèi): Hibernate

          FeedBack:
          # re: 用hibernate作為持久層,update是出現(xiàn)了重復(fù)記錄
          2005-09-07 20:05 | Water Ye@ITO
          在hibernate, 這是不可能發(fā)生的, 貼代碼出來(lái)看看

          update的po不是get或load出來(lái)的吧, 如果是new出來(lái)的, setId就沒(méi)事了

          在開(kāi)發(fā)最好show_sql="true", 這樣就不用也hibernate騙了  回復(fù)  更多評(píng)論
            
          # re: 用hibernate作為持久層,update是出現(xiàn)了重復(fù)記錄
          2005-09-07 22:30 | Harryson
            謝謝,Water Ye的回答和寶貴建議。
          是這樣子的我保存數(shù)據(jù)和更新數(shù)據(jù)都是在同一個(gè)方法中。用的是spring+hibernate的dao implements HibernateDaoSupport在保存的時(shí)候就調(diào)用了
          TjobsheetFinishTemp tft = new TjobsheetFinishTemp();
          tft.set**();
          ...
          getHibernateTemplate().saveOrUpdate(tft);//它用tft(pojo)對(duì)象的equals來(lái)判斷兩個(gè)對(duì)象是否一致。
          可在set**()主鍵的時(shí)候沒(méi)有注意到在另一個(gè)操作時(shí),主鍵值在頁(yè)面中用javascript處理時(shí)給忘記了,:)所以hibernate在處理時(shí),就認(rèn)為它們是不同的對(duì)象。:(

            回復(fù)  更多評(píng)論
            
          # re: 用hibernate作為持久層,update是出現(xiàn)了重復(fù)記錄
          2005-09-07 22:39 | Water Ye@ITO
          id == null時(shí), hb認(rèn)為是新建一條記錄

          對(duì)于簡(jiǎn)單的crud, 保存數(shù)據(jù)和更新數(shù)據(jù)在dao中可以為同一個(gè)方法

          但對(duì)一些復(fù)雜的業(yè)務(wù)處理(單據(jù)的修改), 如果沒(méi)有service層的話, 最好分開(kāi)  回復(fù)  更多評(píng)論
            
          # re: 用hibernate作為持久層,update是出現(xiàn)了重復(fù)記錄
          2005-09-07 23:08 | Harryson
          我現(xiàn)在覺(jué)得也是。現(xiàn)在我就感覺(jué)到了這一點(diǎn)。因?yàn)槲椰F(xiàn)在保存數(shù)據(jù)有時(shí)會(huì)出錯(cuò),現(xiàn)在正在找原因,郁悶了一下午了。:<
          出錯(cuò)信息如下:
          java.lang.ArrayIndexOutOfBoundsException//數(shù)組越界?
          at java.lang.System.arraycopy(Native Method)
          at com.microsoft.jdbc.sqlserver.tds.TDSRPCParameter.write(Unknown Source
          )
          at $Proxy5.addShipment(Unknown Source)//我在action(control)中調(diào)用了DAO中的方法,Unknown Source不知是為會(huì)什么?因?yàn)樵赼ction的類(lèi)中我用了一個(gè)這樣一方法,shipmentDAO.addShipment(this),this代表了本身的對(duì)象,用來(lái)(獲取)傳送頁(yè)面請(qǐng)求的數(shù)據(jù)到DAO中。不知前輩們是怎么處理這個(gè)地方的?
          at com.legend.shipment.web.Shipment2Action.saveShipment(Shipment2Action.
          java:196)//這個(gè)出錯(cuò)的類(lèi)的方法出錯(cuò)的語(yǔ)句, shipmentDAO.addShipment(this);

          還有就是:
          org.springframework.transaction.TransactionSystemException: Could not roll back
          Hibernate transaction; nested exception is org.hibernate.TransactionException: J
          DBC rollback failed
          org.hibernate.TransactionException: JDBC rollback failed
          WARN - DefaultActionInvocation.executeResult(260) | No result defined for action
          com.legend.shipment.web.Shipment2Action and result null

          下面這個(gè)不知會(huì)不會(huì)有問(wèn)題出現(xiàn)呢?
          at com.legend.shipment.dao.hibernate.ShipmentDAOHibernate.generateShipNu
          m(ShipmentDAOHibernate.java:198)
          //Query query = session.createQuery(sql);
          // query.setLong("jftJsId",jsoId.longValue());它們有可能會(huì)出現(xiàn)上面出現(xiàn)的錯(cuò)誤嗎?  回復(fù)  更多評(píng)論
            
          # re: 用hibernate作為持久層,update是出現(xiàn)了重復(fù)記錄
          2005-09-08 15:26 | Harryson
            問(wèn)題怎樣得以解決了,暈了差不多一天。java.lang.ArrayIndexOutOfBoundsException//數(shù)組越界? 都是它惹的禍。因在程序中我是引用了了一個(gè)數(shù)組,但也不至于會(huì)出差吧,:(。那么問(wèn)題到在那呢?是這樣的,在我第系統(tǒng)中要訪問(wèn)兩個(gè)不同的數(shù)據(jù)庫(kù),一個(gè)是當(dāng)前開(kāi)發(fā)的系統(tǒng)的數(shù)據(jù)庫(kù),另一個(gè)是用來(lái)攻取某些數(shù)據(jù)。我只把第一個(gè)數(shù)據(jù)庫(kù)用spring+hibernate來(lái)管理,另一個(gè)用jdbc業(yè)處理。“org.springframework.transaction.TransactionSystemException: Could not roll back
          Hibernate transaction; nested exception is org.hibernate.TransactionException: J
          DBC rollback failed
          org.hibernate.TransactionException: JDBC rollback failed
          WARN - DefaultActionInvocation.executeResult(260) | No result defined for action
          com.legend.shipment.web.Shipment2Action and result null
          ”從這個(gè)看來(lái),我猜想是不是不能在DAO中引用另一個(gè)數(shù)據(jù)庫(kù)的Connection,這樣會(huì)造成spring事務(wù)管理的混亂。于是我就改寫(xiě)。把用jdbc處理的東東,也采用spring+hibernate的模式。問(wèn)題依舊。這可就暈了,眼看系統(tǒng)就要上線了。到了關(guān)鍵時(shí)候怎么出問(wèn)題呢?心里有點(diǎn)緊張,一絲不安。一直有信心把問(wèn)題解決。沒(méi)有辦法了,我只得在整個(gè)程序中添加了很多l(xiāng)og.debug()來(lái)測(cè)試。測(cè)試出,當(dāng)我不用另一個(gè)(獲取數(shù)據(jù)的數(shù)據(jù)庫(kù))時(shí),問(wèn)題就不會(huì)產(chǎn)生,只要一加上就會(huì)產(chǎn)生上述問(wèn)題。這可就奇怪了。還有就是有些數(shù)據(jù)可以,有數(shù)據(jù)數(shù)據(jù)不可以。那么問(wèn)題應(yīng)該出錯(cuò)在數(shù)據(jù)據(jù)格式(轉(zhuǎn)化)上。我把要從獲取數(shù)據(jù)庫(kù)的數(shù)據(jù)手動(dòng)硬寫(xiě)在程序中,程序通過(guò)。我原來(lái)從數(shù)據(jù)庫(kù)獲取的數(shù)據(jù)仔細(xì)看過(guò)。原來(lái),數(shù)據(jù)庫(kù)的數(shù)據(jù)為81.6的數(shù)據(jù)輸出來(lái)的時(shí)候變成了81.599999999999994315658113919198513031005859375。這樣我就想是不是就會(huì)產(chǎn)生數(shù)組溢出呢?原后我就把數(shù)據(jù)改成81.6這樣子就沒(méi)有問(wèn)題了。讓我們仔細(xì)看一下源碼
          sql = "select b.labourCost,b.epibolyCost from TworkCost as b where b.jscostId = :jscostId";
          session = getSession();
          query = session.createQuery(sql);
          query.setInteger("jscostId",jscostId.intValue());
          list = query.list();
          iterator = list.iterator();
          Object[] rows = null;
          while(iterator.hasNext()) {
          rows= (Object[]) iterator.next();
          // System.out.println((BigDecimal)rows[0]+" "+rows[1]);
          }
          "rows"數(shù)組中的內(nèi)容是BigDecimal的,我可把它強(qiáng)制轉(zhuǎn)換成了double型的,就在這個(gè)轉(zhuǎn)換過(guò)程中,小數(shù)位增加了很多,當(dāng)添加到數(shù)據(jù)庫(kù)中時(shí)就發(fā)出了數(shù)組溢出的error!
          所以,搞技術(shù)工作的一定要嚴(yán)謹(jǐn),細(xì)心
            回復(fù)  更多評(píng)論
            

          <2005年9月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          常用鏈接

          留言簿(10)

          隨筆分類(lèi)(319)

          AJAX

          Coffee House

          CSS

          Java

          JavaScript

          Open Source

          ProjectManagement

          友情Blog

          最新隨筆

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 桂平市| 新和县| 永州市| 洛南县| 金昌市| 奈曼旗| 安丘市| 迁西县| 蒙自县| 山阳县| 壶关县| 三河市| 榆树市| 灵丘县| 东港市| 高淳县| 兴化市| 武川县| 大化| 资中县| 周口市| 邓州市| 阿鲁科尔沁旗| 西和县| 奉节县| 青浦区| 拉孜县| 岱山县| 潞西市| 绥芬河市| 屯门区| 夏邑县| 大关县| 北票市| 呈贡县| 宜川县| 安宁市| 宁陕县| 东城区| 宁化县| 淳安县|