gpt4 book ai didi

java - 为什么 FetchType.Eager 会阻止双向映射中的 org.hibernate.TransientObjectException 而 CascadeType.ALL 却没有效果?

转载 作者:太空宇宙 更新时间:2023-11-04 09:30:24 24 4
gpt4 key购买 nike

用 .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

@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:对象引用未保存的 transient 实例 - 在刷新之前保存 transient 实例:....model.Status]

另一方面,当我另外使用 FetchType.EAGER 时,异常消失了,这是我无法理解的。

最佳答案

最有可能的是:

Employee employee = employeeService.getEmployeeByPosition(principal.getName());

这发生在事务 1 中。

employee.addStatus(newStatus);

这里的实体已经处于分离状态,如果不急切,LAZY 加载从此时起将无法工作。

employeeService.updateEmployee(employee);

事务 2 中,您很可能尝试进行内部合并,但集合尚未延迟加载。使用 EAGER 即可,并且合并成功。

关于java - 为什么 FetchType.Eager 会阻止双向映射中的 org.hibernate.TransientObjectException 而 CascadeType.ALL 却没有效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57151063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com