【发布时间】:2022-01-26 06:50:35
【问题描述】:
考虑这段代码:这是来自 Repository 类,我已经用 @Transactional 正确注释了类。
public void addSubjectsToStudents(int studentId, List<Subject> subjects) {
// 1. retrieve subject
Student student = findById(studentId);
// 2. add students
subjects.forEach(subject -> {
// 2.1 subjects are new -> so first persist them
em.persist(subject);
// 2.1 add student to subject
subject.addStudent(student);
// 2.2 add subject to student
// must do both 2.1 and 2.2 because ManyToMany relationship
student.addSubject(subject);
});
// this is newly added line here: why do I need to persist student ?
// now persist the owning side
em.persist(student);
}
现在,当我在没有最后一行的情况下运行代码时,测试工作正常,没有任何错误。但在数据库方面,没有任何更新。
然后我查看了教程,发现我必须坚持拥有方......
现在为什么会这样?我正在从数据库中检索学生(拥有方),因此它由 EntityManager 跟踪(我已将 @PersistenceContext 添加到 em)
因此我只需要预先保留新添加的主题。此时:科目和学生都将由 EntityManager 自动管理。所以我不需要再坚持任何事情了。
但是在这件事上我的想法似乎是错误的。这只发生在 @ManyToMany 关系中。在其他类型中,没有出现此问题。
我在这里缺少什么?我研究过类似的问题,但没有人解释原因。
为简洁起见,我省略了其他代码。如果您需要存储库和实体的这些代码,请随时请求。但是,我已经按照教程添加了所有内容,除此之外,其他案例都已成功通过。
【问题讨论】: