Spring Boot JPA Загрузить много ко многим - PullRequest
1 голос
/ 27 января 2020

У меня есть две таблицы:

Student 
- id
- name
- List<Course>

Course
- id
- title
- List<Student>

У меня есть StudentRepository и CourseRepository (JpaRepository).

Когда я загружаю Студентов с помощью следующего кода:

    fun getAll(): List<Student> {
        return studentRepository.findAll()
    }

Я получаю бесконечный список.

Но я ожидаю этот JSON вывод:

[
 {
  "id":1,
  "name":"Ben"
  "course": [
   {
   "id":1,
   "title":"Math"
   },
   {
    "id":2,
    "title":"English"
   }
  ]
 }
]

Как мне получить этот результат?

// РЕДАКТИРОВАТЬ: Я получаю бесконечный список enter image description here

Ответы [ 3 ]

3 голосов
/ 30 января 2020

Если вы используете Джексона, вы можете сгенерировать json родительского элемента только у потомка, используя аннотации @JsonBackReference (более дочерний) и @JsonManagedReference (более родительский).

Если вы хотите запретить печать отношения, вы можете использовать аннотации @JsonIgnore или @JsonIgnoreProperties над полем, которые не будут сериализованы.

Вот пример для класса Course:

@JsonIgnoreProperties(value = { "students" })
class Course(...)

Вы можете найти больше примеров здесь .

0 голосов
/ 04 февраля 2020
@Entity
class Student {

    @Id
    Long id;

    @ManyToMany
    @JoinTable(
            name = "course_like", 
            joinColumns = @JoinColumn(name = "student_id"), 
            inverseJoinColumns = @JoinColumn(name = "course_id"))
    List<Course> likedCourses;

    // additional properties
    // standard constructors, getters, and setters
}

@Entity
class Course {

    @Id
    Long id;

    @ManyToMany(mappedBy = "likedCourses")
    Set<Student> likes;

    // additional properties
    // standard constructors, getters, and setters
}

Сторона владельца - это место, где мы настраиваем отношения, для которых в этом примере мы выберем класс Student.

Обратите внимание, что при использовании @ JoinTable или даже @ JoinColumn не требуется: JPA сгенерирует для нас имена таблиц и столбцов. Однако стратегия, используемая JPA, не всегда соответствует соглашениям об именах, которые мы используем. Следовательно, есть возможность настроить имена таблиц и столбцов.

На целевой стороне нам нужно только указать имя поля, которое отображает связь. Поэтому мы устанавливаем атрибут mappedBy для @ ManyToMany аннотации в классе Course:

0 голосов
/ 27 января 2020

Вам не нужно List<Student> в классе курса, если только вам не нужно ориентироваться в отношениях в обоих направлениях: Студент-> Курс и Курс -> Студент.

Если это так, то вам нужно обратить внимание как вы перемещаетесь по графику: в al oop, где вы используете / распечатываете все атрибуты Student (ie вкл. курсы), Hibernate извлечет данные, при необходимости запустив дополнительный запрос (ie course.student).

Ситуация, когда это происходит, когда каждый класс имеет toString (), печатающий все атрибуты класса: в al oop Студенты регистрируют каждую итерацию, чтобы инициировать эту бесконечную цепочку вызовов.

...