2015-09-01 77 views
1

我試圖更新用戶窗體中的一些持久對象。
我的POJO類:SpringMVC +休眠 - 模型屬性和更新

public Class MyModel { 
    int primKey; 
    String value; 
    // getter setter 
} 

控制器方法:

@RequestMapping(value="/update/{id}", method=RequestMethod.GET) 
    public String getEditView(@PathVariable int id, ModelMap model) { 
     MyModel mymodel = modelService.getModel(id); 
     model.addAttribute("mymodel", mymodel); 
     return "/edit"; 
    } 

@RequestMapping(value="/update", method=RequestMethod.POST) 
public String updateModel(@ModelAttribute("mymodel") MyModel mymodel, HttpSession session) { 
    session.setAttribute("status", modelService.update(mymodel) ? "success" : "error"); 
    return "redirect:/home"; 
} 

而我的編輯形式:

<form:form modelAttribute="mymodel" role="form" method="post" action="/update"> 
<label>Enter new name:</label> 
<form:input path="value"/> 
<input type="submit" class="btn btn-default" value="Update" /> 
</form:form> 

現在的問題是,當我的UpdateModel收到模型屬性 「爲MyModel」( )方法中,「value」字段被正確填充,但「primKey」字段被設置爲0,這導致Hibernate Session的更新方法失敗。將持久對象作爲「mymodel」傳遞,可以更容易地顯示更新表單,因爲所有映射值都是自動設置的,用戶可以輕鬆修改它們。那麼有什麼辦法來解決這個問題,或者我將不得不傳遞新的MyModel屬性作爲模型並在之後更新持久對象?

+0

您確定,當您加載(GET)更新表單並提交(POST)表單時,您的'value'字段已填充? –

+0

是的。但看來我正在獲得全新的對象。 – user2578525

回答

1

變化int primKey;Integer primaryKey;。默認情況下,int類變量分配爲0,但整數保持爲空。

我想你想自動生成primaryKey並保存一個新的記錄(insert)。要做到這一點primaryKey必須是null

但是由於您在同一個JSP模板中執行更新和插入操作,因此您應該爲您的primaryKey提供隱藏的輸入綁定。

但是,如果您覺得primaryKey是敏感數據,您可以對primaryKey進行編碼並將其保存爲hiddenValue,然後將其發回並解碼並獲取實際值並使用它。

0

primKey0,因爲您使用的是int而不是Integerint不能是null,所以如果未指定,則默認爲0。如果您將primKey更改爲Integer,表單將不會提供值,因此primKey將爲null,並且Hibernate會將該對象愉快地保存爲新記錄。

+0

因此,不可能使用持久對象作爲模型屬性,我將不得不提供虛擬對象並從虛擬對象更新持久對象? – user2578525

0

由於@SeanAdkinson指出你應該從int改變primKeyInteger

而且你應該在你的形式primKey屬性的隱藏字段。因此,每當有一個primKey時,它也會在您提交表單時提交。

<form:hidden path="primKey"/> 
+0

將主鍵顯示爲隱藏屬性是否安全? – user2578525

+0

我不認爲在jsp中有一個'view'作用域,所以你需要使用隱藏域來顯示主鍵。你的控制器只能是單身人士。 –

+0

@NamanGala我不認爲你必須爲主鍵包含一個隱藏的字段。所有的無界值都返回爲空值或默認值,在這種情況下,主鍵 –