Я добавляю объект команды типа Employee в ModelAndView в моем приложении spring-mvc + hibernate.JSP имеет простую форму, которая будет использоваться 2 способами.
1) Для создания новой учетной записи сотрудника
2) Для редактирования существующей учетной записи (здесь будет предварительно заполнена форма.)
В случае создания учетной записи,добавлен объект команды new 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;
}
Является ли аннотированный параметр @ModelAttribute в пружинном контроллере mvc не фактическим переданным объектом команды, а новым объектом того же типа, что и объект команды?Это нормальное поведение, или я что-то упускаю?
И как можно этого добиться?Передача идентификатора в качестве скрытой формы ввода?
Спасибо