2015-09-01 67 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我不认为你必须为主键包含一个隐藏的字段。所有的无界值都返回为空值或默认值,在这种情况下,主键 –