Java Spring Boot H2 Database-Table не отображает все записи и создает новые идентификаторы вместо ссылок на существующие из родительской таблицы - PullRequest
0 голосов
/ 24 апреля 2020

В 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...