Springboot Hibernate Один ко многим бесконечная рекурсия - PullRequest
3 голосов
/ 25 января 2020

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

пользователи
идентификатор
имя пользователя
пароль
... и другие несущественные вещи

деятельность
id
имя
описание
пользователи

Я создал два класса сущностей с их репозиторием (с аннотацией @RepositoryRestResource)

@Entity
public class Users {
    @Id
    private int id;
    private String username;
    private String password;

    @OneToMany(mappedBy = "users")
    private Set<Activities> activities;

    public Set<Activities> getActivities() {
        return activities;
    }

//constructors && getters setters

и


@Entity
public class Activities {

    @Id
    private int id;

    @ManyToOne
    @JoinColumn(name = "users")
    private Users users;

    private String name;

    private String description;

//constructors && get

Я создал конечную точку для тестирования рабочего процесса, создав действие. Все это жестко запрограммировано следующим образом:

 @RequestMapping("/calendar")
    public Set<Activities> goToCalendar(Authentication authentication){
        Users user = unbreakableService.isAuth(authentication);
        Activities activities = new Activities(user,"karate", "entrenobueno");
        activitiesRespository.save(activities);
        return usersRepository.findByUsername(user.getUsername()).getActivities();
    }

Код правильно сохраняет действие, но когда он должен возвращать список действий, он возвращает бесконечную рекурсивную информацию, например:

[{"id":161,"users":{"id":121,"username":"Ojka","password":"$2a$10$Z/bj.5JvQmPquJ67fqF.leUyBkkXJ/2x3z/.bUon8YsIAdV8HMnoG","email":"ojka","pushup":99999,"pullup":null,"handstandhold":9999,"handstandpushup":null,"frontlever":null,"backlever":null,"activities":[{"id":161,"users":{"id":121,"username":"Ojka","password":"$2a$10$Z/bj.5JvQmPquJ67fqF.leUyBkkXJ/2x3z/.bUon8YsIAdV8HMnoG","email":"ojka","pushup":99999,"pullup":null,"handstandhold":9999,"handstandpushup":null,"frontlever":null,"backlever":null,"activities":[{"id":161,"users":{"id":121,"username":"Ojka","password":"$2a$10$Z/bj.5JvQmPquJ67fqF.leUyBkkXJ/2x3z/.bUon8YsIAdV8HMnoG","email":"ojka","pushup":99999,"pullup":null,"handstandhold":9999,"handstandpushup":null,"frontlever":null,"backlever":null,"activities":[{"id":161,"users":{"id":121,"username":"Ojka","password":"$2a$10$Z/bj.5JvQmPquJ67fqF.leUyBkkXJ/2x3z/.bUon8YsIAdV8HMnoG","email":"ojka","pushup":99999,"pullup":null,"handstandhold":9999,"handstandpushup":null,"frontl

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

 Failure while trying to resolve exception [org.springframework.http.converter.HttpMessageNotWritableException]

java.lang.IllegalStateException: Cannot call sendError() after the response has been committed.

И это последняя строка журнала

2020-01-25 20:48:54.795 ERROR 19924 --- [nio-8080-exec-2] s.e.ErrorMvcAutoConfiguration$StaticView : Cannot render error page for request [/api/calendar] and exception [Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: com.unbreakable.unbreakable.persistance.Users["activities"]->org.hibernate.collection.internal.PersistentSet[0]->com.unbreakable.unbreakable.persistance.Activities["users"]->com.unbreakable.unbreakable.persistance.Users["activities"]->org.hibernate.collection.internal.Persi....

Если я проверю действия таблицы (SELECT * FROM ACTIVITIES), бесконечности нет Информация. Всего несколько действий (те, которые я создал, тестируя его).

Я считаю, что он должен возвращать набор действий, которые выполняет пользователь.

1 Ответ

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

Вы можете подавить вывод в json несколькими способами:

  1. Вы можете использовать @JsonIgnore над полем со связью (activities или users).
  2. Если вы хотите сгенерировать json с родителем, но не с детьми, вы можете аннотировать users с помощью @JsonBackReference и activities с помощью @JsonManagedReference
...