【发布时间】:2018-01-19 14:00:28
【问题描述】:
我有两个实体Employee.class 和Project.class,它们之间有@ManyToMany 关系。
当我尝试更新Employee 并通过JSP 表单添加另一个Project 时,控制器使Set<Project>empty。所以,当我提交表单时,休眠而不是向Set<Project> 添加另一个项目,这样做:
Hibernate: update employee set ....(IT'S OK)
Hibernate: update project set...(IT'S OK)
Hibernate: delete from employee_project where employee_id=?(IT'S NOT OK)
Employee.class
@Entity
@Table(name="employee")
public class Employee{
//other fields
@ManyToMany(fetch= FetchType.EAGER,
cascade=CascadeType.ALL)
@JoinTable(name="employee_project",joinColumns=@JoinColumn(name="employee_id"),
inverseJoinColumns=@JoinColumn(name="project_id"))
private Set<Project> projects = new HashSet<>();
public Set<Project> getProjects() {
return projects;
}
public void setProjects(Set<Project> projects) {
this.projects = projects;
}
Project.class
@Entity
@Table(name="project")
public class Project {
@ManyToMany(fetch= FetchType.EAGER, mappedBy="projects")
private Set<Employee> employees = new HashSet<>();
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
EmployeeController.class
@GetMapping("/employeeForm")
public String showEmployeeForm(Model theModel) {
Employee theEmployee = new Employee();
theModel.addAttribute("employee", theEmployee);
theModel.addAttribute("projects", projectService.getProjectsIdMap());
return "employee-form";
}
@GetMapping("/employee/{id}/updateEmployee")
public String updateEmployee(@PathVariable("id") Long employeeId, Model theModel) {
//HERE MY Set<Project> IS FULL OF PROJECTS
theModel.addAttribute("employee", employeeService.getEmployee(employeeId));
theModel.addAttribute("projects", projectService.getProjectsIdMap());
return "employee-form";
}
@PostMapping("/saveEmployee")
public String saveOrUpdateEmployee(@ModelAttribute("employee")
Employee theEmployee) {
//HERE MY Set<Project> IS EMPTY
theEmployee.getProjects()
.add(projectService
.getProject(theEmployee.getProjectId()));
employeeService.saveEmployee(theEmployee);
return "redirect:/employees/employee/" + theEmployee.getId();
}
employee-form.jsp
<form:form action="/employee_manager/employees/saveEmployee"
modelAttribute="employee" method="POST">
<form:hidden path="id"/>
<form:select path="projectId">
<form:options items="${projects}" />
</form:select>
<input type="submit" value="Save" />
</div>
</form:form>
Employee.Repository (DAO)
public void saveEmployee(Employee employee) {
Session session = sessionFactory.getCurrentSession();
session.saveOrUpdate(employee);
}
Employee.Service
@Transactional
public void saveEmployee(Employee employee) {
employeeRepository.saveEmployee(employee);
}
数据库结构: enter image description here
看起来 spring 在某个地方设置了一个新集合,而不是添加到现有集合中。
我试图调试应用程序流程并关注Set<Projects>,我知道这个集合丢失了saveOrUpdateEmployee 方法中的所有值。我不知道我在哪里犯了错误。感谢您的帮助。
【问题讨论】:
-
cascadeType在这里应该不会造成任何问题。可能是saveOrUpdateEmployee,该项目未保存在数据库中,因此无法添加,这可能会导致它设置一个新项目。 -
我同意级联似乎没问题。可能在将 Employee 传递给
saveOrUpdateEmployee方法期间丢失了对Set<Projects>的引用。
标签: java hibernate spring-mvc