SpringMVC + Hibernate - 模型属性&更新

时间:2015-09-01 05:13:22

标签: java spring hibernate spring-mvc java-ee

我试图以用户身份更新某些持久对象。
我的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属性作为模型传递并在之后更新持久对象?

3 个答案:

答案 0 :(得分:1)

int primKey;更改为Integer primaryKey;。默认情况下,int类变量被赋值为0,但是Integer保持为null。

我想你想自动生成primaryKey并保存一条新记录(insert)。为此,primaryKey必须为null

但是由于您在同一个JSP模板中同时执行更新和插入,因此您应该为primaryKey设置隐藏的输入绑定。

但是如果您觉得primaryKey是敏感数据,您可以对primaryKey进行编码并将其保存为hiddenValue,然后将其发回,并对其进行解码并获取实际值并使用它。

答案 1 :(得分:0)

primKey0,因为您使用的是int而非Integerint不能为null,因此如果未指定,则默认为0。如果您将primKey更改为Integer,则表单不会提供值,因此primKey将为null,Hibernate将很乐意保存将对象作为新记录。

答案 2 :(得分:0)

正如 @SeanAdkinson 所指出,您应该将primKeyint更改为Integer

此外,您应在表单中包含primKey属性的隐藏字段。因此,每当有一个primKey时,它也会在您提交表单时提交。

<form:hidden path="primKey"/>