在用 .jsp 中的數(shù)據(jù)填充表單支持 bean(狀態(tài))后,我嘗試將其添加到其父實體(員工)。不幸的是,這會導(dǎo)致 org.hibernate.TransientObjectException。按照某些線程中的建議將 CascadeType.ALL 添加到 @ManyToOne(擁有方,Status.java)沒有任何效果,這應(yīng)該是正確的。但是除了 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); }}模型“狀態(tài)”@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); }}服務(wù)@Servicepublic class EmployeeService {public void updateEmployee(Employee employee) { employeeRepo.save(employee); }}我預(yù)計 @OneToMany 端的 CascadeType.ALL 就足夠了。但這導(dǎo)致HHH000346:托管刷新期間出錯 [org.hibernate.TransientObjectException:對象引用未保存的瞬態(tài)實例 - 在刷新前保存瞬態(tài)實例:....model.Status]另一方面,當我另外使用 FetchType.EAGER 時異常消失了,這是我無法理解的。
1 回答

慕哥6287543
TA貢獻1831條經(jīng)驗 獲得超10個贊
最有可能的:
Employee employee = employeeService.getEmployeeByPosition(principal.getName());
這發(fā)生在事務(wù) 1中。
employee.addStatus(newStatus);
這里的實體已經(jīng)處于分離狀態(tài),如果不急切,LAZY
加載將無法從這一點開始。
employeeService.updateEmployee(employee);
在Transaction 2中,您正在嘗試(很可能是在內(nèi)部)merge
,但該集合尚未延遲加載。有了EAGER
它,合并就成功了。
添加回答
舉報
0/150
提交
取消