Двунаправленный Spring Hibernate ManyToMany StackOverflowError - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь построить двунаправленную ассоциацию ManyToMany.

Итак, у меня есть объект с именем User:

import lombok.Data;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Data
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;

    @ManyToMany(mappedBy="users")
    private List<Chat> chats = new ArrayList<>();
}

И еще один называется Чат:

import lombok.Data;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Data
@Entity
public class Chat {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;

    @ManyToMany
    @JoinTable(name = "chat_user",
        joinColumns = { @JoinColumn(name = "fk_chat") },
        inverseJoinColumns = { @JoinColumn(name = "fk_user") })
    private List<User> users = new ArrayList<>();
}

Итак, когда я пытаюсь сделать:

Chat chat = new Chat();
User user = new User();

user.getChats().add(chat);
chat.getUsers().add(user); // Getting an exception!!!

Получение этого:

Method trew 'java.lang.StackOverflowExceptionError' exception.
Cannot evaluate hello.models.Chat.toString()

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

Так как я могу решить это?

1 Ответ

1 голос
/ 08 марта 2019

Да, вы правы с бесконечной рекурсией.

Как мы решаем эту проблему?Можно попробовать эти шаги

1.Если вы использовали toString() в упомянутых объектах, удалите из него ссылку на другой объект.

2.Можно добавить @JsonIgnore на одной стороне отношения, что разорвет цепочку

    @ManyToMany(mappedBy="users")
    @JsonIgnore
    private List<Chat> chats = new ArrayList<>();

См. эту статью , чтобы узнать больше способов

3.Я заметил, что вы используете Lombok, в этом случае исключите атрибут аннотации toString и, возможно, можете написать пользовательский toString, помня о пункте 1.

...