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<User> users = new HashSet<>(); //一个角色对应多个用户
}

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

插入数据代码如下所示:

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

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

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

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

 

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值