项目异常如下:

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"]->
org.hibernate.collection.internal.PersistentBag[0]->
demo.server.core.domain.UserAddress["user"]->
demo.server.core.domain.User["userAddresses"]->
org.hibernate.collection.internal.PersistentBag[0]->
demo.server.core.domain.UserAddress["user"]->
......//无限递归 java.lang.StackOverflowError: null
at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_111]
at java.lang.ClassLoader.defineClass(Unknown Source) ~[na:1.8.0_111]
at java.security.SecureClassLoader.defineClass(Unknown Source) ~[na:1.8.0_111]
at java.net.URLClassLoader.defineClass(Unknown Source) ~[na:1.8.0_111]
at java.net.URLClassLoader.access$100(Unknown Source) ~[na:1.8.0_111]
at java.net.URLClassLoader$1.run(Unknown Source) ~[na:1.8.0_111]
at java.net.URLClassLoader$1.run(Unknown Source) ~[na:1.8.0_111]
at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_111]
at java.net.URLClassLoader.findClass(Unknown Source) ~[na:1.8.0_111]
at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.8.0_111]
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) ~[na:1.8.0_111]
at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.8.0_111]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:709) ~[jackson-databind-2.8.1.jar:2.8.1]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.8.1.jar:2.8.1]
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:149) ~[jackson-databind-2.8.1.jar:2.8.1]
at
...

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

举个例子:

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

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

省略仓储层代码…

控制层代码

@RestController
public class TestController{
@Autowired
private StudentRepository studentRep; @RequestMapping("/test")
public int test(){
List<Student> students = stntRep.findAll();
students.forEach(data->{
System.out.println(data);
});
return 1;
}
}

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

java.lang.StackOverflowError: null
at java.util.AbstractCollection.toString(Unknown Source) ~[na:1.8.0_111]
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:510) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at java.lang.String.valueOf(Unknown Source) ~[na:1.8.0_111]
at java.lang.StringBuilder.append(Unknown Source) ~[na:1.8.0_111]
at com.demo.domain.Course.toString(Course.java:38) ~[classes/:na]
at java.lang.String.valueOf(Unknown Source) ~[na:1.8.0_111]
at java.lang.StringBuilder.append(Unknown Source) ~[na:1.8.0_111]
at java.util.AbstractCollection.toString(Unknown Source) ~[na:1.8.0_111]
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:510) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at java.lang.String.valueOf(Unknown Source) ~[na:1.8.0_111]
at java.lang.StringBuilder.append(Unknown Source) ~[na:1.8.0_111]
at com.demo.domain.Student.toString(Student.java:40) ~[classes/:na]
....

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

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

解决办法:

方法一:

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

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

这样才能打印出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. 使用Gradle构建项目

    使用gradle构建项目之前,咱们先聊聊maven,使用maven构建项目和配置主要 接下来正式使用gradle来构建项目的和步骤: 1.下载源码 2.下载gradle 1.下载地址:https:// ...

  2. 继续对dubbo源代码进行maven builder

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/enson16855/article/details/32073981 原文地址:http://dtb ...

  3. docker相关教程【转】

    https://www.w3cschool.cn/docker/docker-run-command.html 运行容器 https://www.runoob.com/docker/docker-im ...

  4. MaxCompute技术人背后的故事:从ApacheORC到AliORC

    2019大数据技术公开课第一季<技术人生专访>来袭,本季将带领开发者们探讨大数据技术,分享不同国家的工作体验.本文整理自阿里巴巴计算平台事业部高级技术专家吴刚的专访,将为大家介绍Apach ...

  5. [转] javascript核心

    原文:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ 对象 原型链 构造函数 执行上下文栈 执行上下文 变量对象 活动对象 作用域 ...

  6. Auto reloading enabled

    在eclipse中集成tomcat来开发时, 如果使用run as模式启动项目的话,tomcat配置Auto reloading enabled,我们修改java文件,项目会重新加载,修改的内容会生效 ...

  7. pl/sql进阶一控制结构

    在任何计算机语言(c,java,c#,c++)都有各种控制语句(条件语句,循环结构,顺序控制结构…),在pl/sql中也存在这样的控制结构. 在本部分学校完毕后,希望大家达到: 1)使用各种if语句 ...

  8. ActivityManagerService

    先上类图: 基本类说明和运行框架图中蓝色表示AMS进程,黄色表示app进程.1. 全局调度者在android中,AMS是activity和进程的全局调度者,也就是说系统中载入和准备载入的activit ...

  9. 【JZOJ4884】【NOIP2016提高A组集训第12场11.10】图的半径

    题目描述 mhy12345学习了树的直径,于是开始研究图的半径,具体来说,我们需要在图中选定一个地方作为中心,其中这个中心有可能在路径上. 而这个中心的选址需要能够使得所有节点达到这个中心的最短路里面 ...

  10. jenkins使用教程!

    http://jenkins-ci.org/ 首先去官方下载war包,直接安装jenkins的方式比较麻烦. 下载tomcat,jdk和ant cd /optwget http://mirrors.h ...