Почему я получаю бесконечный список с переполнением стека?

#spring #spring-boot #hibernate #spring-data-jpa #spring-rest

Вопрос:

Я создаю систему бронирования бунгало, но я не могу получить список со многими отношениями, я продолжаю получать бесконечный список с ошибкой stackoverflow. Это сработало, но произошло, когда я добавил отношение «многие ко многим».

Объект привлечения это содержит связь «многие ко многим» с объектом посещения

 @Entity
@Table(name = "attraction")
public class Attraction {
 @Id
 @Column(name = "id")
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private int id;

 @Column(name = "name")
 private String name;

 @Column(name = "historical")
 private Boolean historical;

 @Column(name = "religious")
 private Boolean religious;

 @Column(name = "beaches")
 private Boolean beaches;

 @Column(name = "animal_sanc")
 private Boolean animalSanc;

 @Column(name = "hiking")
 private Boolean hiking;

 @Column(name = "forest")
 private Boolean forest;

 @Column(name = "parks")
 private Boolean parks;

 @Column(name = "lakes")
 private Boolean lakes;

 @ManyToOne
 @JoinColumn(name = "bungalow_id")
 private Bungalow bungalow;

 @ManyToMany(cascade = {CascadeType.MERGE,CascadeType.REFRESH})
 @JoinTable(
        name = "visit_has_attraction",
        joinColumns = @JoinColumn(name = "attraction_id"),
        inverseJoinColumns = @JoinColumn(name = "visit_id")
 )
 private List<Visit> visitList;
 //Constructer, Getters and Setters
}
 

Посетите объект
Это другой конец отношений «многие ко многим»

 @Entity
@Table(name = "visit")
public class Visit {
 @Id
 @Column(name = "id")
 private int id;

 @Column(name = "date")
 private Date date;

 @ManyToOne
 @JoinColumn(name = "user_id")
 private User user;

 @ManyToMany(cascade = {CascadeType.MERGE,CascadeType.REFRESH})
 @JoinTable(
        name = "visit_has_attraction",
        joinColumns = @JoinColumn(name = "visit_id"),
        inverseJoinColumns = @JoinColumn(name = "attraction_id")
 )
 List<Attraction> attractions;
 //Constructer, Getters and Setters
 }
 

Репозиторий JPA

 public List<Attraction> findAttractionsByVisitList(Visit visit);
 
 
 

ЭР приложения
1

Комментарии:

1. Добавьте @JsonIgnore поверх любых списков, которые вы объявили. или попробуйте использовать @JsonBackReference и @JsonManagedReference

2. Можете ли вы извлечь данные из базы данных? Возникает ли проблема только позже? Может быть, при сериализации данных в JSON?

3. Проблема возникает, когда я извлекаю данные из таблицы с отношением «многие ко многим».

4. Если я добавлю @JsonIgnore, я не смогу правильно извлекать данные из списков thses.

5. @JonathanJOhx Спасибо за помощь, использование этих двух помогло, и теперь это работает, спасибо.

Ответ №1:

Я добавил @JsonIgnore к одной из сторон во многих отношениях и добавил @JsonBackReference ко многим сторонам и @JsonManagedReference к одной из многих сторон всех отношений «один ко многим».

 @Entity
@Table(name = "attraction")
public class Attraction {
 @Id
 @Column(name = "id")
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private int id;

 @Column(name = "name")
 private String name;

 @Column(name = "historical")
 private Boolean historical;

 @Column(name = "religious")
 private Boolean religious;

 @Column(name = "beaches")
 private Boolean beaches;

 @Column(name = "animal_sanc")
 private Boolean animalSanc;

 @Column(name = "hiking")
 private Boolean hiking;

 @Column(name = "forest")
 private Boolean forest;

 @Column(name = "parks")
 private Boolean parks;

 @Column(name = "lakes")
 private Boolean lakes;

 @ManyToOne
 @JoinColumn(name = "bungalow_id")
 @JsonBackReference
 private Bungalow bungalow;

 @ManyToMany(cascade = {CascadeType.MERGE,CascadeType.REFRESH})
 @JoinTable(
        name = "visit_has_attraction",
        joinColumns = @JoinColumn(name = "attraction_id"),
        inverseJoinColumns = @JoinColumn(name = "visit_id")
 )
 @JsonIgnore
 private List<Visit> visitList;
 //Constructer, Getters and Setters
}
 

Посетите объект
Это другой конец отношений «многие ко многим»

 @Entity
@Table(name = "visit")
public class Visit {
 @Id
 @Column(name = "id")
 private int id;

 @Column(name = "date")
 private Date date;

 @ManyToOne
 @JoinColumn(name = "user_id")
 @JsonBackReference
 private User user;

 @ManyToMany(cascade = {CascadeType.MERGE,CascadeType.REFRESH})
 @JoinTable(
        name = "visit_has_attraction",
        joinColumns = @JoinColumn(name = "visit_id"),
        inverseJoinColumns = @JoinColumn(name = "attraction_id")
 )
 List<Attraction> attractions;
 //Constructer, Getters and Setters
 }