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方法就会导致 堆栈溢出,解决我问题的那篇文章也没有给出具体的原因。希望有大神给出出现这种情况的原因....