项目异常如下:

  1. 2018-01-26 17:12:38.162 WARN 3128 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: demo.server.core.domain.User["userAddresses"]->
  2. org.hibernate.collection.internal.PersistentBag[0]->
  3. demo.server.core.domain.UserAddress["user"]->
  4. demo.server.core.domain.User["userAddresses"]->
  5. org.hibernate.collection.internal.PersistentBag[0]->
  6. demo.server.core.domain.UserAddress["user"]->
  7. ......//无限递归
  8. java.lang.StackOverflowError: null
  9. at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_111]
  10. at java.lang.ClassLoader.defineClass(Unknown Source) ~[na:1.8.0_111]
  11. at java.security.SecureClassLoader.defineClass(Unknown Source) ~[na:1.8.0_111]
  12. at java.net.URLClassLoader.defineClass(Unknown Source) ~[na:1.8.0_111]
  13. at java.net.URLClassLoader.access$100(Unknown Source) ~[na:1.8.0_111]
  14. at java.net.URLClassLoader$1.run(Unknown Source) ~[na:1.8.0_111]
  15. at java.net.URLClassLoader$1.run(Unknown Source) ~[na:1.8.0_111]
  16. at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_111]
  17. at java.net.URLClassLoader.findClass(Unknown Source) ~[na:1.8.0_111]
  18. at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.8.0_111]
  19. at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) ~[na:1.8.0_111]
  20. at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.8.0_111]
  21. at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:709) ~[jackson-databind-2.8.1.jar:2.8.1]
  22. at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.8.1.jar:2.8.1]
  23. at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:149) ~[jackson-databind-2.8.1.jar:2.8.1]
  24. at
  25. ...

看异常的名字会发现是栈溢出,而且第一处后面出现大量的递归的提示,这边的原因是因为使用了jpa的实体类注解@ManyToMany,@ManyToOne,@OneToOne并且是双向表关联

举个例子:

  1. @Entity
  2. @Table(name = "t_student")
  3. public class Student{
  4. @Id
  5. @GeneratedValue
  6. private Integer sId;
  7. @Column(length = 20)
  8. private String sName;
  9. //学生所修课程
  10. @ManyToMany(mappedBy = "students")
  11. private List<Course> courses;
  12. //get、set 方法省略
  13. }
  1. @Entity
  2. @Table(name = "t_course")
  3. public class Course{
  4. @Id
  5. @GeneratedValue
  6. private Integer cId;
  7. @Column(length = 20)
  8. private String cName;
  9. //上课的学生
  10. @ManyToMany(cascade = CascadeType.ALL)
  11. private List<Student> students;
  12. //get、set 方法省略
  13. }

一个student类和一个course类分别对应 t_student 表和 t_course表,它们是多对多的关系,一个学生可以修多个课程,一个课程可以有多个学生修

省略仓储层代码…

控制层代码

  1. @RestController
  2. public class TestController{
  3. @Autowired
  4. private StudentRepository studentRep;
  5. @RequestMapping("/test")
  6. public int test(){
  7. List<Student> students = stntRep.findAll();
  8. students.forEach(data->{
  9. System.out.println(data);
  10. });
  11. return 1;
  12. }
  13. }

此时,程序运行便会报 java.lang.StackOverflowError: null 异常

  1. java.lang.StackOverflowError: null
  2. at java.util.AbstractCollection.toString(Unknown Source) ~[na:1.8.0_111]
  3. at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:510) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
  4. at java.lang.String.valueOf(Unknown Source) ~[na:1.8.0_111]
  5. at java.lang.StringBuilder.append(Unknown Source) ~[na:1.8.0_111]
  6. at com.demo.domain.Course.toString(Course.java:38) ~[classes/:na]
  7. at java.lang.String.valueOf(Unknown Source) ~[na:1.8.0_111]
  8. at java.lang.StringBuilder.append(Unknown Source) ~[na:1.8.0_111]
  9. at java.util.AbstractCollection.toString(Unknown Source) ~[na:1.8.0_111]
  10. at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:510) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
  11. at java.lang.String.valueOf(Unknown Source) ~[na:1.8.0_111]
  12. at java.lang.StringBuilder.append(Unknown Source) ~[na:1.8.0_111]
  13. at com.demo.domain.Student.toString(Student.java:40) ~[classes/:na]
  14. ....

Student类中有一个字段List<Course> courses,在遍历集合中,输出一个student实例的时候,List<Course> courses 字段也将输出,因为是双向多对多的关联查询,每一个Course实例也会输出List<Student> students 字段值,因此一直递归下去直到栈溢出报错,若是单向多对多就不会发生这样地递归

其实一开始报这个错完全是因为对spring-data-jpa不熟悉,了解之后一想就通了。

解决办法:

方法一:

此处,若不需要查看关联表中的字段信息时,可以在遍历List<Student> students集合时先将关联对象设置为null,即:

  1. students.forEach(data->{
  2. data.setCourses(null);
  3. System.out.println(data);
  4. });

这样才能打印出Student 实例中除了courses 字段之外地所有数据

方法二:

取消使用双向多对多关联,改为使用单向多对多,这样也可以同时将关联表中所对应的数据查询出来使用

原文地址:https://blog.csdn.net/pbhLOVEpp/article/details/77945651

hibernate无限递归问题的更多相关文章

  1. -java转json hibernate懒加载造成的无限递归问题

    1.在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系. JoinColumn(name="pid") 2. 在保存数据时,总是先保存的 ...

  2. jackson java转json hibernate懒加载造成的无限递归问题

    @JsonIgnore @JsonFilter @JsonBackReference @JsonManagedReference @JsonIgnoreProperties jackson中的@Jso ...

  3. JPA一对多循环引用的解决&&JackSon无限递归问题

    说是解决,其实不是很完美的解决的,写出来只是想记录一下这个问题或者看一下有没有哪位仁兄会的,能否知道一二. 下面说说出现问题: 问题是这样的,当我查询一个一对多的实体的时候,工具直接就爆了,差不多我就 ...

  4. 无限递归的构造器和javap使用指南

    无限递归的构造器和javap使用指南 public class ConstructorRecursion { ConstructorRecursion rc; { rc = newConstructo ...

  5. 无限“递归”的python程序

    如果一个函数直接或者间接调用了自己,那么就形成了递归(recursion),比如斐波那契数列的一个实现 def fib(n): if n <= 2: return 1 else: return ...

  6. 【整理】iview Tree数据格式问题,无限递归树处理数据

    iview Tree数据格式问题,无限递归树处理数据 https://juejin.im/post/5b51a8a4e51d455d6825be20

  7. C# .NetCore简单实现无限递归的功能

    1:在实际开发中,我们会经常使用到无限递归的情况,如菜单,父子级等的情况 2:Code 1 using System; 2 using System.Collections.Generic; 3 us ...

  8. vue 无限递归级联组件实现方案

    最终组件效果图: 无限级联组件实现思想: 在这里有一个很重要的地方就是前端组件如何与后端匹配方法协调好,无限级联很好实现,但是如何让服务器端可以成功的匹配到条件是一个问题,在这里我借鉴了html元素的 ...

  9. SqlServer与Linq 无限递归目录树且输出层级

    ALTER VIEW [dbo].[view_TreeLevel] AS WITH cte AS ( SELECT a.ModuleID , a.Module_Name , a.Module_Desc ...

随机推荐

  1. Android 程序员不得不收藏的个人博客(持续更新...)

    本文已收录我的 Github ,持续更新中 ,欢迎点赞 ! 每周打开一次收藏夹里的个人博客,已经成为了我的人生一大乐趣. 相比各大博客平台,我一直更加偏爱个人博客.在每个人自己的这一亩三分地里,你能看 ...

  2. 计算机网络 5.6-5.8 TCP/UDP

    来看看传输层的位置 要点: 传输层是为两个应用进程提供端到端的通信 传输层的复用和分用 传输层与应用层就是端口 (传输层的应用访问点 TSP) 传输层与网络层之间就是协议字段(网络层的 NTSP) 端 ...

  3. 【水滴石穿】MyFirstRNDemo

    比较简单的项目 //index.js /** @format */ import {AppRegistry} from 'react-native'; //默认创建的类 import App from ...

  4. CodePlus2017 12月月赛 div2火锅盛宴

    当时看到这道题感觉真是难过,我数据结构太弱啦. 我们来看看需要求什么: 1.当前熟了的食物的最小id 2.当前熟了的食物中有没有编号为id的食物 3.当前没熟的食物中有没有编号为id的食物 4.当前没 ...

  5. 【JZOJ4747】【NOIP2016提高A组模拟9.3】被粉碎的线段树

    题目描述 输入 第一行包括两个正整数,N ,M ,分别表示线段树的宽以及询问次数. 以下N-1 行以先序遍历(dfs深搜顺序)描述一个小R线段树,每行一个正整数表示当前非叶子节点的 mid,保证每个节 ...

  6. 介绍elasticsearch的文件

    elasticsearch.yml文件 打开上边的文件,我们看到下面的"集群"名称,节点名称 下图是文件的存储路径和日志路径 下面是监听的地址,默认是本机 下图指的是,集群是怎样搭 ...

  7. centos7.3 docker安装grafana

    一.编写docker-cmpose文件 docker-compose.yml文件如下: version: "3.3" services: grafana: image: grafa ...

  8. python 语法错误

  9. DRP 2016-06-30 16:36 314人阅读 评论(21) 收藏

    学习drp有一段时间了,其实从很久以前,再提高班的学习就已经不是单纯的学习,学习总是伴随着项目.这就使得我们的学习不可能全天的,大把大把时间的学习只出现在第一和第二年,所以,各自珍惜吧. DRP(Di ...

  10. Gym - 101962B_Color Changing Sofa

    题意:将一个沙发放到一个分成好几个色块(一个字母代表一种颜色)的房间里,要求沙发染成跟所在色块一样的颜色,沙发分成(0,1)两种,0可以染成一种颜色,1可以染成一种颜色(换句话说,沙发最多两种颜色), ...