关于SpringDataJpa中测试出现StackOverflowError错误问题

Posted 一眼千山,白驹掠影

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于SpringDataJpa中测试出现StackOverflowError错误问题相关的知识,希望对你有一定的参考价值。

在使用SpringDataJpa进行多表查询时,使用导航查询,每次都出现

StackOverflowError错误,

经过查找资料,网上百度,终于找到原因,

StackOverflowError 是栈溢出的意思
当我自己遇到这个问题百度出来的造成原因几乎都是说 递归或者死循环导致。 我自己的项目却是因为写了实体类中的toString方法导致。

  因为所做的测试是多对多的测试,两边的实体类中都有对方对象的集合对象,

    //其中一个实体类
    public class Hobby implements java.io.Serializable {
        // Fields
        private Integer hobbyId;
        private String hobbyName;
        private Set<Nurse> nurses = new HashSet<Nurse>();
    }
    //另一个一个实体类
    public class Nurse implements java.io.Serializable {
        // Fields
        private Integer id;
        private Dept dept;
        private String name;
        private Integer age;
        private String content;
        private String datea;
        private Set<Hobby> hobbies = new HashSet<Hobby>();
    }

  可以看出俩个实体类互相都有对方的一个set集合。如果用tostring方法输出其中一个实体类Hobby,他对应的set
  集合也会输出,里面的另一个实体类Nurse也会输出,然后Nurse里面还有Hobby的set集合。这样就陷入了死循环无限互相输出。 

 解决方式之一

  删除两个实体类的toString方法

 解决方式之二

  输出之前将其中的 set集合设置为null
  Nurse nurse = new Nurse();
  nurse.setNurses(null);  

 解决方式之三

  利用JsonConfigUtil 去除死循环工具类

  JsonConfig config = JsonConfigUtil.getConfig();
  JSONArray.fromObject(list, config);
  把要转换json格式的对象或集合放入第一个参数,
  把工具类创建的对象设置为第二个参数
  就能完成自动断开关系。去掉死循环

以上是关于关于SpringDataJpa中测试出现StackOverflowError错误问题的主要内容,如果未能解决你的问题,请参考以下文章

SpringDataJPA中出现的保存出现的Caused by: org.hibernate.PersistentObjectException: detached entity passed to

Spring Data JPA - 手动插入后的密钥冲突

第二章-spring boot springDataJPA快速开发DAO层,junit测试

SpringBoot中使用SpringDataJPA

关于 Spring JdbcTemplate 的一些总结

SpringDataJpa学习