2011-02-15 94 views
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控制器中注释的参数不是传递的实际命令对象,而是与命令对象相同类型的新对象?这是正常的行为还是我错过了什么?

那么实现这个目标的方法是什么?将标识符作为隐藏表单输入?

感谢

回答

0

虽然添加命令对象,你应该给员工的名字,而不是命令即的ModelAttribute名。

相关问题