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