在将Entity对象保存到数据库时,Hibernate无法找到标识符

时间:2011-02-15 11:04:23

标签: hibernate spring-mvc

我在spring-mvc + hibernate应用程序中向ModelAndView添加了一个Employee类型的命令对象。 jsp有一个简单的形式,将以两种方式使用。

1)创建新的员工帐户

2)编辑现有帐户(此处表格将预填充。)

在帐户创建案例中,添加的命令对象为new Employee()。但是在第二种情况下,我从数据库加载employee对象并将其作为命令对象传递。这填充表单而不明确提及其他任何内容。

但是在提交编辑后的表单时,hibernate无法找到标识符,从而引发异常 -

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;     
    }

是不是Spring mvc控制器中的@ModelAttribute注释参数不是传递的实际命令对象,而是与命令对象相同类型的新对象?这是正常行为还是我错过了什么?

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

由于

1 个答案:

答案 0 :(得分:0)

添加命令对象时,应该使用名称employee而不是命令,即ModelAttribute name。