我试图以用户身份更新某些持久对象。
我的POJO班级:
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>
现在我的问题是当我收到模型属性&#34; mymodel&#34;在updateModel()方法中,&#34;值&#34;字段填写正确,但&#34; primKey&#34; field设置为0,导致Hibernate Session的更新方法失败。将持久对象传递为&#34; mymodel&#34;可以更轻松地显示更新表单,因为所有映射值都是自动设置的,用户可以轻松修改它们。那么有没有办法解决这个问题,或者我必须将新的MyModel属性作为模型传递并在之后更新持久对象?
答案 0 :(得分:1)
将int primKey;
更改为Integer primaryKey;
。默认情况下,int类变量被赋值为0,但是Integer保持为null。
我想你想自动生成primaryKey
并保存一条新记录(insert
)。为此,primaryKey
必须为null
。
但是由于您在同一个JSP模板中同时执行更新和插入,因此您应该为primaryKey
设置隐藏的输入绑定。
但是如果您觉得primaryKey是敏感数据,您可以对primaryKey进行编码并将其保存为hiddenValue,然后将其发回,并对其进行解码并获取实际值并使用它。
答案 1 :(得分:0)
primKey
为0
,因为您使用的是int
而非Integer
。 int
不能为null
,因此如果未指定,则默认为0
。如果您将primKey
更改为Integer
,则表单不会提供值,因此primKey
将为null
,Hibernate将很乐意保存将对象作为新记录。
答案 2 :(得分:0)
正如 @SeanAdkinson 所指出,您应该将primKey
从int
更改为Integer
。
此外,您应在表单中包含primKey
属性的隐藏字段。因此,每当有一个primKey时,它也会在您提交表单时提交。
<form:hidden path="primKey"/>