<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

        

         
    posted on 2005-09-07 14:22 Harryson 閱讀(6184) 評論(5)  編輯  收藏 所屬分類: Hibernate

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

    update的po不是get或load出來的吧, 如果是new出來的, setId就沒事了

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

      回復  更多評論
      
    # re: 用hibernate作為持久層,update是出現了重復記錄
    2005-09-07 22:39 | Water Ye@ITO
    id == null時, hb認為是新建一條記錄

    對于簡單的crud, 保存數據和更新數據在dao中可以為同一個方法

    但對一些復雜的業務處理(單據的修改), 如果沒有service層的話, 最好分開  回復  更多評論
      
    # re: 用hibernate作為持久層,update是出現了重復記錄
    2005-09-07 23:08 | Harryson
    我現在覺得也是。現在我就感覺到了這一點。因為我現在保存數據有時會出錯,現在正在找原因,郁悶了一下午了。:<
    出錯信息如下:
    java.lang.ArrayIndexOutOfBoundsException//數組越界?
    at java.lang.System.arraycopy(Native Method)
    at com.microsoft.jdbc.sqlserver.tds.TDSRPCParameter.write(Unknown Source
    )
    at $Proxy5.addShipment(Unknown Source)//我在action(control)中調用了DAO中的方法,Unknown Source不知是為會什么?因為在action的類中我用了一個這樣一方法,shipmentDAO.addShipment(this),this代表了本身的對象,用來(獲取)傳送頁面請求的數據到DAO中。不知前輩們是怎么處理這個地方的?
    at com.legend.shipment.web.Shipment2Action.saveShipment(Shipment2Action.
    java:196)//這個出錯的類的方法出錯的語句, 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

    下面這個不知會不會有問題出現呢?
    at com.legend.shipment.dao.hibernate.ShipmentDAOHibernate.generateShipNu
    m(ShipmentDAOHibernate.java:198)
    //Query query = session.createQuery(sql);
    // query.setLong("jftJsId",jsoId.longValue());它們有可能會出現上面出現的錯誤嗎?  回復  更多評論
      
    # re: 用hibernate作為持久層,update是出現了重復記錄
    2005-09-08 15:26 | Harryson
      問題怎樣得以解決了,暈了差不多一天。java.lang.ArrayIndexOutOfBoundsException//數組越界? 都是它惹的禍。因在程序中我是引用了了一個數組,但也不至于會出差吧,:(。那么問題到在那呢?是這樣的,在我第系統中要訪問兩個不同的數據庫,一個是當前開發的系統的數據庫,另一個是用來攻取某些數據。我只把第一個數據庫用spring+hibernate來管理,另一個用jdbc業處理。“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
    ”從這個看來,我猜想是不是不能在DAO中引用另一個數據庫的Connection,這樣會造成spring事務管理的混亂。于是我就改寫。把用jdbc處理的東東,也采用spring+hibernate的模式。問題依舊。這可就暈了,眼看系統就要上線了。到了關鍵時候怎么出問題呢?心里有點緊張,一絲不安。一直有信心把問題解決。沒有辦法了,我只得在整個程序中添加了很多log.debug()來測試。測試出,當我不用另一個(獲取數據的數據庫)時,問題就不會產生,只要一加上就會產生上述問題。這可就奇怪了。還有就是有些數據可以,有數據數據不可以。那么問題應該出錯在數據據格式(轉化)上。我把要從獲取數據庫的數據手動硬寫在程序中,程序通過。我原來從數據庫獲取的數據仔細看過。原來,數據庫的數據為81.6的數據輸出來的時候變成了81.599999999999994315658113919198513031005859375。這樣我就想是不是就會產生數組溢出呢?原后我就把數據改成81.6這樣子就沒有問題了。讓我們仔細看一下源碼
    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"數組中的內容是BigDecimal的,我可把它強制轉換成了double型的,就在這個轉換過程中,小數位增加了很多,當添加到數據庫中時就發出了數組溢出的error!
    所以,搞技術工作的一定要嚴謹,細心
      回復  更多評論
      

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

    常用鏈接

    留言簿(10)

    隨筆分類(319)

    AJAX

    Coffee House

    CSS

    Java

    JavaScript

    Open Source

    ProjectManagement

    友情Blog

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲视频免费在线播放| 国产日韩一区二区三免费高清| 久久精品国产69国产精品亚洲| 日韩免费在线中文字幕| 国产三级免费观看| 亚洲第一成年免费网站| 日本人护士免费xxxx视频| 亚洲国产日韩a在线播放| 国产一区二区三区无码免费| 无码 免费 国产在线观看91| 国产亚洲精午夜久久久久久| 花蝴蝶免费视频在线观看高清版| 亚洲AV无码乱码国产麻豆穿越| 久99久精品免费视频热77| 亚洲精品成人图区| 大地资源免费更新在线播放 | 亚洲成av人片天堂网无码】| 全免费A级毛片免费看网站| 国产成人亚洲精品蜜芽影院| a级亚洲片精品久久久久久久 | 亚洲免费日韩无码系列| 成av免费大片黄在线观看| 亚洲av成人无码久久精品| 无码人妻一区二区三区免费手机| 亚洲夂夂婷婷色拍WW47| 亚洲国产精品综合久久一线| 国产麻豆成人传媒免费观看| 亚洲毛片免费视频| 国产女高清在线看免费观看| 在线观看人成视频免费无遮挡| 亚洲精品国产成人| 免费国产精品视频| 久久免费高清视频| 亚洲日本久久久午夜精品| 亚洲精品国产自在久久 | 国产麻豆成人传媒免费观看| 国产精品亚洲午夜一区二区三区 | 男人的天堂亚洲一区二区三区 | 色屁屁在线观看视频免费| 免费在线看v网址| 青草青草视频2免费观看|