SpringBoot JPA 一对多双向映射堆栈溢出(java.lang.StackOverflowError)问题解决

 SpringBoot JPA使用起来十分方便,今日在使用Jpa进入数据插入时,报 堆栈溢出异常,百度了许久,找到了解决办法,下面将给出该问题具体描述和解决办法。

如下代码所示,两个实体类,User 和Roles 

@Data
@Entity
@Table(name = "t_users") 
public class User {

   ...

    @ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.PERSIST)
    @JoinColumn(name = "roles_id") 
    private Roles roles;
}
@Data
@Entity
@Table(name = "t_rules")
public class Roles {
    .....

    @OneToMany(mappedBy = "roles")  //一对多
    private Set users = new HashSet<>(); //一个角色对应多个用户
}

 一个用户对应一个角色,而一个角色对应多个用户,两个实体类之间进行了双向映射。

插入数据代码如下所示:

     public void test(){
        //创建用户
            //.... 省略
        // 创建角色
           // .... 省略
        //关联
        roles.getUsers().add(user);
        user.setRoles(roles);

        //保存
        repository.save(user);
    }

 执行该方法后报错信息如下所示:

SpringBoot JPA 一对多双向映射堆栈溢出(java.lang.StackOverflowError)问题解决_第1张图片

 百度查询后,找到一篇帖子说只要破坏某一方实体类的 toString方法即可解决,于是我就把Roles实体类中的@Data(来自与lombok)去掉, 然后给添加了get 和set方法,在测试插入数据,发现可以成功插入了,并且自动在Roles表(空表)中插入了 角色为管理员的记录。

SpringBoot JPA 一对多双向映射堆栈溢出(java.lang.StackOverflowError)问题解决_第2张图片 

 并不知道为什么两方存在toString方法就会导致 堆栈溢出,解决我问题的那篇文章也没有给出具体的原因。希望有大神给出出现这种情况的原因....

你可能感兴趣的:(SpringBoot,SpringBoot相关知识)