在用 .jsp 中的数据填充表单支持 bean(状态)后,我尝试将其添加到其父实体(员工)。不幸的是,这会导致 org.hibernate.TransientObjectException。按照某些线程中的建议将 CascadeType.ALL 添加到 @ManyToOne(拥有方,Status.java)没有任何效果,这应该是正确的。但是除了 CascadeType.ALL 之外,在 @OneToMany(引用端,Employee.java)上添加 fetch = FetchType.EAGER 可以解决问题(如下面的代码所示)。模型“雇员”@Entitypublic 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); }}模型“状态”@Entitypublic class Status implements Comparable<Status> {@ManyToOne@JoinColumn(name = "employee_id")private Employee employee;}控制器@Controllerpublic 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); }}服务@Servicepublic class EmployeeService {public void updateEmployee(Employee employee) { employeeRepo.save(employee); }}我预计 @OneToMany 端的 CascadeType.ALL 就足够了。但这导致HHH000346:托管刷新期间出错 [org.hibernate.TransientObjectException:对象引用未保存的瞬态实例 - 在刷新前保存瞬态实例:....model.Status]另一方面,当我另外使用 FetchType.EAGER 时异常消失了,这是我无法理解的。
1 回答
慕哥6287543
TA贡献1831条经验 获得超10个赞
最有可能的:
Employee employee = employeeService.getEmployeeByPosition(principal.getName());
这发生在事务 1中。
employee.addStatus(newStatus);
这里的实体已经处于分离状态,如果不急切,LAZY
加载将无法从这一点开始。
employeeService.updateEmployee(employee);
在Transaction 2中,您正在尝试(很可能是在内部)merge
,但该集合尚未延迟加载。有了EAGER
它,合并就成功了。
添加回答
举报
0/150
提交
取消