在用 .jsp 中的数据填充表单支持 bean(状态)后,我尝试将其添加到其父实体(员工)。不幸的是,这会导致 org.hibernate.TransientObjectException。
按照某些线程中的建议将 CascadeType.ALL 添加到 @ManyToOne(拥有方,Status.java)没有任何效果,这应该是正确的。但是除了 CascadeType.ALL 之外,在 @OneToMany(引用端,Employee.java)上添加 fetch = FetchType.EAGER 可以解决问题(如下面的代码所示)。
模型“雇员”
@Entity
public class Employee {
@OneToMany(mappedBy = "employee", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Status> statusList = new ArrayList<Status>();
public void addStatus(Status status) {
this.statusList.add(status);
status.setEmployee(this);
}
}
模型“状态”
@Entity
public class Status implements Comparable<Status> {
@ManyToOne
@JoinColumn(name = "employee_id")
private Employee employee;
}
控制器
@Controller
public class DashboardController {
@PostMapping("addStatus")
public String addStatus(@Valid @ModelAttribute("newStatus") Status newStatus Principal principal) {
Employee employee = employeeService.getEmployeeByPosition(principal.getName());
employee.addStatus(newStatus);
employeeService.updateEmployee(employee);
}
}
服务
@Service
public class EmployeeService {
public void updateEmployee(Employee employee) {
employeeRepo.save(employee);
}
}
我预计 @OneToMany 端的 CascadeType.ALL 就足够了。但这导致
HHH000346:托管刷新期间出错 [org.hibernate.TransientObjectException:对象引用未保存的瞬态实例 - 在刷新前保存瞬态实例:....model.Status]
另一方面,当我另外使用 FetchType.EAGER 时异常消失了,这是我无法理解的。
慕哥6287543
相关分类