Java 互相关联的实体无限递归问题的解决

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 + " ");
}
}
}

小结一下吧

递归算法是一种直接或间接地调用自身的算法。如果一个问题可以解可以分解为几个子问题的解; 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样;并且存在明显的递归终止条件;那么递归将是一种不错的选择。

 

相关推荐

  • 腾讯云团队为什么用阿里云的服务名?
  • SpringBoot超大文件上传,实现秒传!
  • 《用 C 写 Python》系列 PDF 版本发布啦!!!
  • 让人眼前一亮的应用「GitHub 热点速览」
  • 构建 Java 镜像的 10 个最佳实践
  • 美国政府考虑再次打压华为;超60国发现新变种CH.1.1;杜海涛被起诉,最新判决来了 | 每日大新闻
  • 四个菜1500块!旅游宰客真是“中国特色”?
  • 【了解】代码生成利器fastmybatis
  • MySQL大数据表处理的三种方案,查询效率嘎嘎高!
  • 如何设计一个微博feed流
  • 建议不因钱选工作专家实控多家公司;三大航亏超千亿;保时捷12.4万元帕纳梅拉遭抢购;韩国想取消对中国公民签证限制...|酷玩日爆
  • 取名鬼才 | 每日一冷
  • 中国医院:一面赶英超美,一面步履蹒跚
  • 一口飙汁!15mm巨厚安格斯牛肉饼,有了它我再也没去过汉堡店!
  • 日本窒化铁锅暴利时代,结束了
  • 简单总结下我国在2022年的一些高端技术突破
  • 流浪地球2被外媒打低分?我觉得很好,请加大力度
  • 一文带你入门图机器学习
  • MySQL性能优化浅析及线上案例
  • 防止学生使用AI作弊,斯坦福推出DetectGPT反制