Я хочу создать двунаправленное отношение учеников к дисциплине. Все работает нормально, пока я не зачислил пользователя на дисциплину. Теперь я получаю бесконечную рекурсию.Гибернайт бесконечной рекурсии цикла во многих отношениях
Классы выглядит следующим образом: появляется
//Student.java
@Entity
@Table(name = "students")
public class Student {
@NotNull
@Id
@Column(name = "STUDENT_ID")
private String id;
private String name;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "students_disciplines", joinColumns = @JoinColumn(name = "STUDENT_ID"), inverseJoinColumns = @JoinColumn(name = "DISCIPLINE_ID"))
@JsonSerialize(using = NestedDisciplineSetSerializer.class)
private Set<Discipline> disciplines = new HashSet<>();
//Getters, Setters
}
//NestedDisciplineSetSerializer.java
public class NestedDisciplineSetSerializer extends JsonSerializer<Set<Discipline>> {
@Override
public void serialize(Set<Discipline> value, JsonGenerator jgen, SerializerProvider p) throws IOException, JsonProcessingException {
jgen.writeStartArray();
for (Discipline s : value) {
jgen.writeStartObject();
jgen.writeStringField("name", s.getName());
jgen.writeNumberField("id", s.getId());
jgen.writeBooleanField("recommended", s.isRecommended());
jgen.writeEndObject();
}
jgen.writeEndArray();
}
}
//Discipline.java
@Entity`enter code here`
@Table(name = "disciplines")
public class Discipline {
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
@Column(name = "DISCIPLINE_ID")
private int id;
@NotNull
private String name;
@NotNull
private int credits;
private String annotation;
private boolean recommended;
@ManyToMany(mappedBy = "disciplines", fetch = FetchType.EAGER)
@JsonSerialize(using = NestedStudentSetSerializer.class)
private Set<Student> students = new HashSet<>();
//Getters, Setters
}
//NestedStudentSetSerializer.java
public class NestedStudentSetSerializer extends JsonSerializer<Set<Student>> {
@Override
public void serialize(Set<Student> value, JsonGenerator jgen, SerializerProvider p) throws IOException, JsonProcessingException {
jgen.writeStartArray();
for (Student s : value) {
jgen.writeStartObject();
jgen.writeStringField("name", s.getName());
jgen.writeStringField("id", s.getId());
jgen.writeEndObject();
}
jgen.writeEndArray();
}
}
Ошибка будет при загрузке Set после Student s = sDao.findOne(id);
Пробовал искать здесь, но не смог найти правильное решение. Все получило тот же результат.
Спасибо за ответ, проблема была в библиотеке ломбока, которую я использовал для упрощения генерации геттеров и сеттеров. Это @Data аннотация генерирует hashCode() метод для обоих объектов, которые создали цикл. – TrueLecter
Добро пожаловать :) Спасибо за отзыв. – davidxxx