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