猿问

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

在用 .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 时异常消失了,这是我无法理解的。


回首忆惘然
浏览 97回答 1
1回答

慕哥6287543

最有可能的:Employee&nbsp;employee&nbsp;=&nbsp;employeeService.getEmployeeByPosition(principal.getName());这发生在事务 1中。employee.addStatus(newStatus);这里的实体已经处于分离状态,如果不急切,LAZY加载将无法从这一点开始。employeeService.updateEmployee(employee);在Transaction 2中,您正在尝试(很可能是在内部)merge,但该集合尚未延迟加载。有了EAGER它,合并就成功了。
随时随地看视频慕课网APP

相关分类

Java
我要回答