В Spring Boot я создал две сущности JPA, Student и Course, которые я хочу объединить в объединяющую таблицу, которая использует автоматически генерируемые идентификаторы родительских таблиц в качестве внешних ключей.
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String course;
private String courseTitle;
private String courseDescription;
@ManyToMany
@JoinTable(
name="student_course",
joinColumns= { @JoinColumn(name="student_id") },
inverseJoinColumns = { @JoinColumn(name="course_id") })
private Set<Student> students = new HashSet<Student>();
...
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String firstName;
private String lastName;
@ManyToMany(mappedBy = "students")
private Set<Course> courses = new HashSet<Course>();
...
В своем классе компонентов я создаю студентов и курсы и назначаю их друг другу. В базе данных H2, таблица для студентов и курсов верна. В объединяющей таблице отображаются только 2 записи. Для student_ids у него есть идентификаторы 4 и 5 (хотя ни у одного студента с этими идентификаторами нет, они имеют идентификаторы 1, 2 и 3), а course_id находится в обеих записях 1.
@Component
public class BootStrapData implements CommandLineRunner {
private final StudentRepository studentRepository;
private final CourseRepository courseRepository;
public BootStrapData(StudentRepository studentRepository, CourseRepository courseRepository) {
this.studentRepository = studentRepository;
this.courseRepository = courseRepository;
}
@Override
public void run(String... args) throws Exception {
Student bob = new Student("Bob", "Wild");
Student gil = new Student("Gil", "Mess");
Course oop = new Course( "CS202", "OOP", "Object-Oriented Programming");
Course intro = new Course("SC101", "Intro", "Introduction to Computer Science");
bob.getCourses().add(intro);
bob.getCourses().add(oop);
gil.getCourses().add(intro);
oop.getStudents().add(bob);
oop.getStudents().add(gil);
intro.getStudents().add(bob);
intro.getStudents().add(gil);
studentRepository.save(bob);
studentRepository.save(gil);
courseRepository.save(oop);
courseRepository.save(intro);
System.out.println("Number of Courses: " + courseRepository.count());
System.out.println("Number of Students: " + studentRepository.count());
System.out.println("Students in Course OOP: " + oop.getStudents());
}
}
Выходные данные для courseRepository.count () и studentRepository.count () является правильным. oop .getStudents () выводит только одну запись, студент с идентификатором 1.
Соединительная таблица student_course:
SELECT * FROM STUDENT_COURSE;
STUDENT_ID COURSE_ID
4 1
5 1