最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Java互相关联的实体无限递归问题解决方法
时间:2022-06-29 02:08:36 编辑:袖梨 来源:一聚教程网
本篇文章小编给大家分享一下Java互相关联的实体无限递归问题解决方法,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
今天在测试的时候出现了一个bug,在把关联实体序列化返回的过程中报错了,提示
Caused by: java.lang.StackOverflowError: null
这个是堆栈溢出错误,根据错误线索查找,最后发现Column和Table实体互相关联,也就是说
Column实体中有Table属性,Table实体中也有Column属性,导致了在序列化的过程中出现了死循环,无限递归,以至堆栈溢出报错。
在Jackson2.0以前的解决办法是
在关联的属性上添加
@JsonBackReference
或者
@JsonIgnore
注解中的一个即可。但是从Jackson2.0以后的版本开始,提供@JsonIdentityInfo注解实现这个问题的解决,在实体类前加注解
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
好好理解Java中的递归
递归的思想
把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。
一句话总结:递归就是自己调用自己。
递归的条件要素
1、递归有两个重要条件
可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式。(自身调用)
存在一种简单情境,可以使递归在简单情境下退出。(递归出口)
2、递归的三要素
尝试将一个问题化简到更小的规模
父问题与子问题不能有重叠的部分
一定有一种可以退出程序的情况
递归的算法结构
递归的常用算法伪代码如下:
func( mode){ if(endCondition){ //递归出口 end; }else{ func(mode_small) //调用本身,递归 } }
递归实战举例
递归讲起来还是有点小抽象,我们直接来看代码
1、斐波那契数的递归实现
斐波那契数列的递推公式:Fib(n)=Fib(n-1)+Fib(n-2),生成数列(1、1、2、3、5、8...)。
public static int fib(int n) throws Exception { if (n < 0){ throw new Exception("请输入正确的参数"); } else if (n == 0 || n == 1){ return n; } else { return fib(n - 1) + fib(n - 2); // 调用自己 } }
2、99乘法表的递归实现
public static void mul(int n){ if(n==1){ System.out.println("1*1=1"); }else { mul(n -1); for(int i=1;i<=n;i++){ System.out.println(i + "*" + n + "=" + i*n + " "); } } }
相关文章
- 《原神》5.2卡池抽取建议 11-14
- 《原神》5.2版本新怪物介绍 11-14
- 《原神》希诺宁增伤触发方法 11-14
- 《原神》循音觅奇活动入口 11-14
- 《原神》循音觅奇兑换码获取方法 11-14
- 《原神》花羽会活动飞行技巧介绍 11-14