1
我在spring-mvc + hibernate应用程序中添加了一个类型为Employee的命令对象到ModelAndView。 jsp有一个简单的形式,将以两种方式使用。Hibernate无法找到标识符,同时将实体对象保存到数据库
1)要创建新雇员帐户
2)要编辑现有帐户(此处的形式将预填充。)
在帐户创建的情况下,添加的命令对象是new Employee()
。然而,在第二种情况下,我从数据库加载员工对象并将其作为命令对象传递。这填充表单而不明确提及其他任何内容。
但是在提交编辑形式,休眠找不到标识符从而抛出异常 -
org.springframework.web.util.NestedServletException: Request processing failed; nested
exception is org.hibernate.TransientObjectException: The given object has a null
identifier: org.kodeplay.springroll.model.Employee
映射到这个表格动作控制器的方法是这样
@RequestMapping(value="/update.htm", method = RequestMethod.POST)
public ModelAndView update(@ModelAttribute("employee") Employee employee,
BindingResult result) {
Map<String, String> errors = employeeService.validationErrors(employee);
if(errors.isEmpty()) {
//success
employeeService.editEmployee(employee);
ModelAndView mav = this.displayList();
mav.addObject("success", "Employee Updated Successfully");
return mav;
}
else {
//show form again with errors
ModelAndView mav = this.displayForm(employee);
mav.addObject("errors", errors);
return mav;
}
}
private ModelAndView displayForm(Employee employee) {
ModelAndView mav = new ModelAndView("employee/form");
if(employee == null){
mav.addObject("command", new Employee());
}
else {
mav.addObject("command", employee);
}
return mav;
}
难道@ModelAttribute在spring mvc控制器中注释的参数不是传递的实际命令对象,而是与命令对象相同类型的新对象?这是正常的行为还是我错过了什么?
那么实现这个目标的方法是什么?将标识符作为隐藏表单输入?
感谢