首页 > 解决方案 > 如何在SpringBoot中使用带有额外列的新实体保存实体多对多

问题描述

我必须用 Course 实体保存实体 Student,但我有一个额外的实体类 StudentCourse 来放置课程的开始日期和结束日期。如何一次持久化所有数据?到目前为止,这是我的代码:

@Entity
public class Student{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "student_id")
    private Integer id;
    private String firstName;
    private String lastName;
    @OneToMany(mappedBy = "student")
    Set<StudentCourse> studentCourses;

//have getter and setters and overridden hashCode() and equals
}
@Entity
public class StudentCourse {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "student_id")
    Student student;
    @ManyToOne
    @JoinColumn(name = "course_id")
    Course course;
    private Date startDate;
    private Date endDate;
}
@Entity
public class Course {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "course_id")
    private Integer id;
    private String name;
    private String description;

    @OneToMany(mappedBy = "course")
    Set<StudentCourse> studentCourses;

}

我需要用课程集保存实体学生,还需要将开始日期和结束日期添加到 StudentCourse 表中。我正在使用 JpaRepository 接口。

标签: javaspring-boot

解决方案


请注意在您的案例cascade中使用@OneToMany注释。我建议不要使用它并按照这些步骤来持久化它们。

  1. 分别持久化StudentCourse实例。(我建议ManyToOne只在联合实体中使用)。
  2. 在一个新的(也许使用名称更好)实例中建立和之间的关系Student并将其持久化。注意,学生和课程实例应该是第一步中的持久化实例CourseStudentCourseCourseRegistration

您可以将上述步骤包装在事务范围中。

// dummy codes.
@Service 
@Transactional
class SomeService {

    public void saveCourseWithStudents(){
      var savedCourse = courseRepository.save(course);
      var savedStudent = studentRepository.save(student);
    
      studentCourse.setCourse(savedCourse );
      studentCourse.setStudent(savedStudent );

      studentCourseRepsoitory.save(studentCourse);
    }

}

我有一个现有的 Spring Boot 示例(包括详细的测试代码,以及用于持续测试、dockerizing 等的 Github 操作)演示如何以多对多关系设计 Restful API,这与您的情况非常相似,但我@ManyToMany直接使用了注解.


推荐阅读