Я пытаюсь построить двунаправленную ассоциацию ManyToMany.
Итак, у меня есть объект с именем Пользователь:
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 . Если вы использовали toString() в упомянутых объектах, удалите из него ссылку на другой объект.
2 . Можно добавить @JsonIgnore с одной стороны отношения, что разорвет цепочку
@ManyToMany(mappedBy = "users")
@JsonIgnore
private List<Chat> chats = new ArrayList<>();
Дополнительные способы см. в разделе эта статья.
3 . Я заметил, что вы используете Lombok, в этом случае исключите атрибут аннотации toString и, возможно, сможете написать собственный toString, учитывая пункт 1.