为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 FetchType.Eager 在双向映射中阻止

为什么 FetchType.Eager 在双向映射中阻止

回首忆惘然 2023-04-13 10:52:14
在用 .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它,合并就成功了。


查看完整回答
反对 回复 2023-04-13
  • 1 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信