【问题标题】:Spring Hibernate Bidirectional ManyToMany StackOverflowErrorSpring Hibernate 双向多对多 StackOverflowError
【发布时间】:2019-07-29 17:51:12
【问题描述】:

我正在尝试建立双向多对多关联。

所以,我有一个名为用户的实体:

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<>();
}

还有一个叫 Chat:

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()

我认为问题是:Chat 有用户,引用该 Chat,该 Chat 有用户再次引用该 Chat,依此类推。

那我该如何解决呢?

【问题讨论】:

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


    【解决方案1】:

    是的,你是对的,永无止境的递归。

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

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

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

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

    更多方法请参考this article

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

    【讨论】:

      猜你喜欢
      • 2015-09-05
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 2023-03-17
      • 2012-09-28
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多