2011-12-21 56 views
0

我正在通過AJAX從表單更新記錄。我有一個映射到我的實體JSON對象,和我的控制器的方法是:Spring JSON合併

@RequestMapping(value = "/vendors", method = RequestMethod.POST) 
public ResponseEntity<String> saveVendorsJson(@RequestParam String vendor) { 
    Vendor v = Vendor.fromJsonToVendor(vendor); 

    if (v.merge() == null) { 
     v.persist(); 
    } 
    return new ResponseEntity<String>(HttpStatus.OK); 
} 

我從v.merge()的文件預計將返回null,如果它沒有找到對象的現有記錄'id'字段進行合併,在這種情況下,我想將其作爲新的Vendor對象持久化。

發生了什麼事情,儘管我的JSON具有與現有記錄匹配的'id'字段值,但我始終使用瀏覽器中的更新商品插入新記錄。

我知道我在POST方法拉雙重職責在這裏,這是不嚴格RESTful。理論上,這對我來說更簡單(當然,事實證明情況並非如此)。

+0

我認爲'Vendor'是一個自定義類,它擴展了實現'.merge()'和'.persist()'的東西。你提到的實現類和「文檔」是什麼?如果你上面說的是準確的話,一切看起來都正確並且應該有效。 – 2011-12-21 16:23:17

+0

供應商是由Spring-Roo註釋'@ RooEntity'進行建模的POJO,它是'persist()'方法的來源。 – 2011-12-21 16:28:35

+0

我正在使用的文檔是[here](http://static.springsource.org/spring-roo/reference/html/base-json.html),搜索字符串「merge」。 – 2011-12-21 16:29:42

回答

0

我相信這是一個Hibernate的東西。如果Hibernate不知道它已經存在,它將不會「合併」。我認爲我過去所做的是做一個查找,然後堅持。我認爲如果你試圖合併來自電線的東西,你會得到一個主鍵衝突,或類似的東西。我相信Hibernate有一些內部的「髒」標誌來指示你是否正在創建或編輯一個現有的對象。

原來還有一種方法在Hibernate中做一個軟性查詢,基本上告訴Hibernate「看,我有這個對象,我不想做一個SELECT等於blah-blah-blah,我只是想更新一些領域「。它會將對象加載到Cache中,並允許您在不首先執行SELECT的情況下執行更新。在Spring中還有一個updateOrSave(),但實際上首先執行SELECT。