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