1. 程式人生 > >lombok和JPA的死遞迴

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. 想知道為什麼一個東西不好用,自己去用一下。如果你沒有不爽,那你就別在說它不好用;如果你不爽了,那就搞清楚自己為什麼不爽。