在 JPA 中,如果我们有一个由一个实体映射的 OneToMany 或 ManyToMany,我们是否需要在 setter 中更新两者?

问题描述 投票:0回答:2

假设我们有教师表和学生表

一个老师,很多学生。

关系如下图

@Entity
@Table(name = "teacher")
public class Teacher {

    @OneToMany(mappedBy="teacher")
    private Set<Student> student = new HashSet<>();

    }
}
@Entity
@Table(name = "student")
public class Student {

    @ManyToOne
    private Teacher teacher;

}

假设我们有一个这样的新学生:

Student student = new Student();

我需要像这样更新和保存老师和学生吗:

teacher.getStudent().add(student);
student.setTeacher(teacher);
teacherRepository.save(teacher);
studentRepository.save(student);

还是只救学生就可以了?

现在如果是多对多怎么办?

@Entity
@Table(name = "teacher")
public class Teacher {

    @ManyToMany(mappedBy="teacher")
    private Set<Student> student = new HashSet<>();

    }
}
@Entity
@Table(name = "student")
public class Student {

    @ManyToMany
    @JoinTable(
            name="teacher_student",
            joinColumns = @JoinColumn(name = "teacher_id"),
            inverseJoinColumns = @JoinColumn(name = "student_id")
    )
    private Set<Teacher> teacher = new HashSet<>();

}

我可以为此从学生方面保存吗?

如果您在从学生端保存之前也从教师端保存会怎样?

例如

teacherRepository.save(teacher)
student.setTeacher(teacher);
studentRepository.save(student);
java spring spring-boot jpa spring-data-jpa
2个回答
0
投票

对于

OneToMany
关系,你只需要更新和保存student对象,Hibernate会自动负责更新数据库中的关系。但是,如果您还想确保关系在内存中正确更新,您还可以将student添加到teacher的student集合并在student对象上设置teacher

所以你可以这样做:

Student student = new Student();
student.setTeacher(teacher);
studentRepository.save(student);

对于

ManyToMany
关系,您也可以从student端保存,因为Hibernate会自动负责更新teacherstudent集合。您可以通过以下方式进行:

Student student = new Student();
student.getTeacher().add(teacher);
studentRepository.save(student);

0
投票

就我而言,我创建并使用了以下便捷方法。

@Entit
@Table(name = "student")
public class Student {

    @ManyToOne
    private Teacher teacher;

    ...
    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
        teacher.getStudnet().add(this);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.