在用 .jsp 中的數(shù)據(jù)填充表單支持 bean(狀態(tài))后,我嘗試將其添加到其父實(shí)體(員工)。不幸的是,這會(huì)導(dǎo)致 org.hibernate.TransientObjectException。按照某些線程中的建議將 CascadeType.ALL 添加到 @ManyToOne(擁有方,Status.java)沒(méi)有任何效果,這應(yīng)該是正確的。但是除了 CascadeType.ALL 之外,在 @OneToMany(引用端,Employee.java)上添加 fetch = FetchType.EAGER 可以解決問(wèn)題(如下面的代碼所示)。模型“雇員”@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ù)計(jì) @OneToMany 端的 CascadeType.ALL 就足夠了。但這導(dǎo)致HHH000346:托管刷新期間出錯(cuò) [org.hibernate.TransientObjectException:對(duì)象引用未保存的瞬態(tài)實(shí)例 - 在刷新前保存瞬態(tài)實(shí)例:....model.Status]另一方面,當(dāng)我另外使用 FetchType.EAGER 時(shí)異常消失了,這是我無(wú)法理解的。
1 回答

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