如何在使用spring mvc和hibernate更新之前预先填充对象?

时间:2012-05-22 15:36:03

标签: java spring hibernate spring-mvc

在使用hibernate保存此对象之前预先填充对象的最佳做法是什么?

我做了什么:

我的控制器:

//The Form
@RequestMapping(value = "user/{id}/edit", method = RequestMethod.GET)
public String edit(@PathVariable("id") Long userId, ModelMap modelMap) {
    modelMap.addAttribute("user", userService.find(userId));    
    return "user/userEdit";

}
//Updating database
@RequestMapping(value = "user/edit", method = RequestMethod.POST)
public String update(@ModelAttribute("user") @Valid User user, BindingResult result,
                                                RedirectAttributes redirectAttrs) {
    if (result.hasErrors()) {
            return "user/userEdit";
    }else{
        userService.update(user);
        redirectAttrs.addFlashAttribute("message", "Success");

        return "redirect:user/userEdit";
    }
}

如果我制作一个包含所有字段(用户名,密码和ID)的表单,它会起作用,但如果我希望用户只更新密码,该怎么办?

由于我在用户名上有一个@NotEmpty,我收到一个用户名为空的错误,因为它不在表单中,但我不想把用户名字段,只是密码。

我的HTML格式:

<c:url var="url" value="/user/edit" />
<form:form method="post" action="${url}" modelAttribute="user" class="form-horizontal">
    <form:hidden path="id"/>
    <form:hidden path="version"/>
    <fieldset>
        <div class="control-group">
            <form:label cssClass="control-label" path="password"><spring:message code="user.label.password"/>: </form:label>
            <div class="controls">
                <form:input cssClass="input-xlarge" path="password" />
            </div>
            <form:errors path="password"/>
        </div>
        <div class="control-group">
            <form:label cssClass="control-label" path="userRole"><spring:message code="user.label.role"/>: </form:label>
            <div class="controls">
                <form:select path="userRole">
                       <form:options items="${userRoleList}" itemValue="id" itemLabel="name"/>
                </form:select>
            </div>
            <form:errors path="userRole"/>
        </div>
        <div class="control-group">
            <form:label cssClass="control-label" path="costumer.id"><spring:message code="user.label.costumer"/>: </form:label>
            <div class="controls">
                <form:select path="costumer.id">
                       <form:options items="${costumerList}" itemValue="id" itemLabel="name"/>
                </form:select>
            </div>
            <form:errors path="costumer.id"/>
        </div>

        <div class="form-actions">
            <button type="submit" class="btn btn-primary">Save changes</button>
            <a class="btn cancel link" href="<c:url value="/user" />">Cancel</a>
        </div>
    </fieldset>
</form:form>
  • 我尝试使用@Sessionattributes,但是如果我尝试的话它也不能正常工作 使用浏览器标签编辑两个或更多用户。
  • 我尝试使用属性编辑器,但没有使用@ModelAtrribute 用户用户。
  • 我尝试使用转换器,但没有工作。

是首先创建User user = userService.find(id)的唯一方法,然后设置更新的值?类似的东西:

@RequestMapping(value = "user/edit", method = RequestMethod.POST)
public String update(@RequestParam("password") String password, BindingResult result, RedirectAttributes redirectAttrs) {
    User user = userService.find(id);
if (password == null{                           
    return "user/userEdit";
}else{
    user.setPassword("password");
    userService.update(user);
    redirectAttrs.addFlashAttribute("message", "Success");

    return "redirect:user/userEdit";
}
}

哪个看错了,因为没有验证。

4 个答案:

答案 0 :(得分:0)

另一种方法,我认为不那么混乱和容易发生意外,就是创建一个模拟UI表单的类,例如

public class EditUserForm {
    // getters and setters for password and other fields...
}

并且在控制器的update(EditUserForm,...)方法中,您只需将EditUserForm中用户填充的任何字段映射到您要更新的User实例。

答案 1 :(得分:0)

在您发布的代码中,很明显您需要一些外部帮助程序类来与GUI端更新相关联,然后才能实现移动控制和持久性操作。

答案 2 :(得分:0)

我也遇到过这个问题,如果只有几个字段我会使用你的第二个例子并逐个验证字段。否则,您将不得不做其他海报所说的内容,并创建一个新的课程来匹配您的表格。

答案 3 :(得分:0)

尝试使用:

@PrePersist
@PreUpdate
public void prepare(){
//与你的实体一起做 //例如:if(name == null){name =“MYNAMEVALUE”;} }