lombok和JPA的死递归

原创 2018年04月17日 09:18:00

这是一个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. 想知道为什么一个东西不好用,自己去用一下。如果你没有不爽,那你就别在说它不好用;如果你不爽了,那就搞清楚自己为什么不爽。

JPA中一对多时候的重复问题

用List会有重复,用Set
  • liduanwh
  • liduanwh
  • 2018-02-27 21:50:21
  • 63

sts spring JPA(项目安装环境)

1.JDK安装 1.1.jdk config: http://jingyan.baidu.com/album/f96699bb8b38e0894e3c1bef.html?picindex=1 系统...
  • ncqqbesny
  • ncqqbesny
  • 2016-02-05 09:06:02
  • 2039

Lombok使用笔记

lombok使用记录
  • along_love
  • along_love
  • 2017-12-29 17:13:27
  • 158

lombok快速入门:实体类中再也不用写setter和getter,toString等方法了

lombok快速入门:实体类中再也不用写setter和getter,toString等方法了
  • baidu_37107022
  • baidu_37107022
  • 2017-07-25 17:40:34
  • 778

JPA关系映射系列二:one-to-one主键关联

SpringDataJPA是Spring Data的一个子项目,通过提供基于JPA的Repository极大的减少了JPA作为数据访问方案的代码量,你仅仅需要编写一个接口集成下SpringDataJP...
  • dandandeshangni
  • dandandeshangni
  • 2018-03-01 09:26:50
  • 67

jpa单表递归树形结构实现

  • 2017年07月23日 21:57
  • 30KB
  • 下载

JPA的CRITICAL API

如果问我,CRITICAL API和JPQL相比,有什么优点,我只能答,可以拿出来装...哈哈!了解它,我觉得一个主要的目的,可以看明白别人写的代码.CRITICAL API是一个构建查询的编程API...
  • xiejx618
  • xiejx618
  • 2015-11-07 22:45:59
  • 1182

死递归:“段错误”产生的可能原因之一

我和Linux下的“段错误”的第一次邂逅是在前几天,当我尝试着去写一个控制台下的扫雷程序的时候。 扫雷程序在这里且不谈算法的优劣,个人认为关键的两点一个是给雷点周围的点置上相应的雷数,另一点就是当...
  • mzlogin
  • mzlogin
  • 2008-11-10 14:09:00
  • 1489

hibernate关联对象通过Springmvc转json死循环

hibernate关联对象通过Springmvc转json死循环 @JsonIgnoreProperties(value={"hibernateLazyInitializer","handler"}...
  • q11604316081
  • q11604316081
  • 2017-12-14 21:22:25
  • 97

梳理Tree遍历-四种基本方法+JPA注解解决

已知已有对象为Tree。 public class Tree { long id; String name; Tree parent; Set chi...
  • u014586894
  • u014586894
  • 2016-06-12 22:16:42
  • 809
收藏助手
不良信息举报
您举报文章:lombok和JPA的死递归
举报原因:
原因补充:

(最多只允许输入30个字)