【发布时间】:2025-12-21 19:45:15
【问题描述】:
用 .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 时,异常消失了,我无法理解。
【问题讨论】:
标签: java hibernate spring-boot spring-mvc spring-data-jpa