Spring Hibernate双向ManyToMany StackOverflowError

时间:2019-03-07 18:36:15

标签: spring hibernate spring-boot jpa many-to-many

我正在尝试建立双向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 个答案:

答案 0 :(得分:1)

是的,永无止境的递归是正确的。

我们如何解决这个问题?可以尝试这些步骤

1。如果您在提到的实体中使用过toString(),请从中删除其他实体的引用。

2。可以在关系的一侧添加@JsonIgnore,这会破坏链条

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

有关更多方法,请参考this article

3。我注意到您正在使用Lombok,在这种情况下,请排除toString批注的属性,并且可以编写自定义toString并牢记第1点。