#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
}