这是一个Bug

JPA我觉得是一个封装的很棒的框架,至于说很臃肿这个事,我觉得在需求需要很多复杂查询的时候,不适合用JPA。因为它的封装太棒了,以致于增强了表和实体类之间的耦合。不过在一些简单查询的部分,它真的太好用了。

而关于这个Bug,就不单单是JPA自身的问题了,究其原因是我在实体类中,使用了lombok框架的@Data,这是一个使用注解,在编译时修改语法树并且自动生成Getter、Setter方法并且会实现toString,和hashCode方法得一个框架。其实这个本身也没问题,而且我一直觉得很好用。

可是当这两个因素合在一起的时候,出现了问题。因为在实体类中存在多对多的关联关系,因此实体类A在实例化的时候,会实例化实体类B并调用它的toString和hashCode。可是在实体B实例化的时候,又会实例化对应的A并调用它的toString和hashCode。是的,你猜的没错,这是一个没有结束条件的递归,也可以叫死递归。会出现什么情况呢,简单来说就是一个StackOverflow。

一些想法

知道了问题之后,就会发现其实解决问题就没那么难了。想了一下问题出现的原因,有了一些简单的思考:
1. 框架的封装导致在看不到的地方,可能会有我们意想不到的问题;
2. 在没有真正弄清楚框架在做了什么之前,不要对其完全信任(比如我们可以用lombok,但是要清楚它做了什么,如果没弄清楚还不如用Getter和Setter—反正可以直接生成);
3. ibatis做的好的一点应该就是,它没有封装的太严实,在表和实体之间有了更大的定制空间;
4. 想知道为什么一个东西不好用,自己去用一下。如果你没有不爽,那你就别在说它不好用;如果你不爽了,那就搞清楚自己为什么不爽。

lombok和JPA的死递归相关推荐

  1. EZDML批量生成spring-boot jpa swagger2 lombok后端接口

    EZDML是一款国产免费的轻量级数据建模工具,具有轻巧.快速.简便而功能强大的特点,可轻松地进行数据库表结构设计,建立界面数据模型,支持通过自定义脚本模板生成测试数据.界面原型和前后端代码文件. 当然 ...

  2. Javascript函数之深入浅出递归思想,附案例与代码!

    作者 | 浮世万千吾爱有三 责编 | Carol 来源 | CSDN 博客 递归函数的理解 1.生活中的递归 "递归"在生活中的一个典例就是"问路".如图小哥哥 ...

  3. 十一、递归----迷宫问题

    一.递归的概念 1.递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时 可以让代码变得简洁. 二.递归调用机制 三.递归可以解决的问题 1.各种数学问题如: 8 ...

  4. java 递归_Java的递归、如何与流相结合

    递归技术 需求:扫描D:est所有子文件夹及子子文件夹下的.jpg文件. 我们如果用循环来做这件事,我们不知道循环的结束条件,也不知道到底有多少层,所以比较麻烦. 我们可以用一种新的思想:递归. 递归 ...

  5. 数据结构 递归讲解

    1. 递归的定义 定义好简单了, 如果1个函数直接或间接地调用自己本身, 我们就说它是1个递归. 2. 不同函数是怎样互相调用的. 严蔚敏编写的的数据结构教材中写过这段话: 当1个函数(A)的运行期间 ...

  6. DFS迷宫递归所有路径 新手入门

    这篇文章写给自己以后复习和个个入门朋友:提示同学们一定耐心看完解释 哪怕看得很难受,我是新手我懂大家的心烦.看完后慢慢体会代码 我们假设迷宫为如下状况:         {0,0,1,0}       ...

  7. java递归api_javaAPI_IO流基础_递归使用

    IO流_递归 1.递归概述 递归指的是方法定义中调用自身方法的情况. 2.递归的注意事项 (1).要有出口,否则就是死递归 (2).次数不能太多,否则就内存溢出 (3).构造方法不能递归使用[不然在创 ...

  8. C语言 函数递归例题解析

    1.接受一个整形值(无符号),把它转换为 字符并打印它 模拟实现strlen()函数. 3.求n的阶乘 4.斐波那契数列 总结 1.接受一个整形值(无符号),把它转换为 字符并打印它 void fun ...

  9. java怎么递归_Java的递归、如何与流相结合

    递归技术 需求:扫描D:\test所有子文件夹及子子文件夹下的.jpg文件. 我们如果用循环来做这件事,我们不知道循环的结束条件,也不知道到底有多少层,所以比较麻烦. 我们可以用一种新的思想:递归. ...

最新文章

  1. 判断TREE的某个节点是否是叶节点.
  2. JAVA框架之Hibernate【配置文件详解】
  3. C#事件与委托的区别
  4. PAT1061 判断题 (15 分)
  5. 282. 给表达式添加运算符
  6. 动态定时任务数据库获取方式
  7. 不用下载安装,你的机器人可以直接在浏览器里跳舞丨Jupyter-ROS
  8. upload-labs19记录
  9. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_汇总
  10. 【教程】PDF控件Spire.PDF 教程:在C#中加密和解密PDF文件
  11. 机器人学导论 二、正运动学,MDH法
  12. linux超级块编辑,在EXT4 linux系统上模拟丢失的超级块错误
  13. 关键接口性能测试报告
  14. Dx unsupported class file version 52.0
  15. docker_相关操作
  16. ArcGIS属性表的计算
  17. vue-video-player,springboot实现视频分段下载播放
  18. 修改并上传SyntaxHighlighter源码个性化博客代码风格
  19. [计算机毕设]基于java的打飞机游戏系统设计与实现(项目报告+源代码)
  20. WEB Basic基础-07

热门文章

  1. 控制台游戏7-泡泡堂
  2. NV GTX480对ATI HD5870:另一个视角
  3. 如何压缩jpg图片的大小?可以一键压缩图片的软件有哪些?
  4. 一键GHOST 硬盘版/优盘版/光盘版/软盘版
  5. kesioncms ajax分页,KesionCMS v9首次更新 修复已知BUG
  6. linux strace 源码,strace-4.3.rar
  7. 网盘:MEGASync
  8. 用java设计节拍器_java定时执行方法节拍器
  9. 【基于C#的图书借阅管理系统(ASP.NET)】
  10. 条形码打印机无法打印条形码