我有一个实体类 像这样的员工。它有一个对象部门(另一个实体(
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@NotNull
@NotEmpty
@Valid
private String name;
@DateTimeFormat(pattern="dd/MM/yyyy")
@Valid
private Date date;
private String cmt;
private String address;
private String position;
private Boolean matrimony = true;
@ManyToOne
@Valid
private Department department;
}
控制器,创建控制器显示编辑页面,并添加控制器解决添加请求:
@RequestMapping(value = "/employee/add", method = RequestMethod.POST)
public String add(@Validated @ModelAttribute(value = "employee") Employee employee) {
employeeRepository.save(employee);
return "redirect:./list";
}
@RequestMapping(value = "/employee/create")
public ModelAndView create(ModelMap mm) {
mm.addAttribute("action", "add");
mm.addAttribute("employee", new Employee());
mm.addAttribute("dao", new DepartmentDAO(departmentRepository));
return new ModelAndView("../jsp/employee/edit.jsp");
}
查看,它是输入员工数据并提交添加方法的形式。
<form:form method="POST" action="${website_url}" commandName="employee">
<form:hidden path="id"></form:hidden>
<div class="form-group">
Name:
<form:input path="name" class="form-control"></form:input>
</div>
<div class="form-group">
Date of birth:
<form:input path="date" class="form-control"></form:input>
</div>
<div class="form-group">
ID card number:
<form:input path="cmt" class="form-control"></form:input>
</div>
<div class="form-group">
Address:
<form:input path="address" class="form-control"></form:input>
</div>
<div class="form-group">
Department:
<form:select path="department.id" class="form-control">
<% for(Department department : departmentDAO.departmentRepository.findAll()){%>
<form:option value="<%= department.getId() %>">
<%= department.getName() %>
</form:option>
<% } %>
</form:select>
</div>
<div class="form-group">
Position:
<form:select path="position" class="form-control">
<form:option value="Director">Director</form:option>
<form:option value="Department Leader">Department Leader</form:option>
<form:option value="Employee">Employee</form:option>
</form:select>
</div>
<div class="form-group form-inline">
Matrimony:
<form:checkbox path="matrimony" class="form-control"></form:checkbox>
</div>
<input type="submit" value="save" class="btn btn-primary form-control" />
</form:form>
我运行弹簧,它正确加载编辑页面。但是我提交了表格,由于外键部门,我收到了400 Bad请求。
JPA 很可能抱怨您将分离的 Department
实体传递给persist
。
您应该使用一种服务方法,该方法将按照employee.setDepartment(departmentDAO.findById(employee.getDepartment().getId()))
行调用某些内容,然后才调用employeeRepository.save(employee)
。
或者,您可以将cascade = MERGE
添加到您的@ManyToOne
并在您的控制器中放置类似的代码行,尽管它在事务方面并不安全。