1. 程式人生 > >我真的不想再用 JPA 了

我真的不想再用 JPA 了

在開發者的圈子裡,沒當說到一種技術好或者不好,都會引發激烈或者不激烈的爭論,直到一個開發者出來說 PHP 是世界上最好的語言,大家夥兒才會紛紛退去繼續寫程式碼。

今天說 JPA 的問題不是想引發什麼討論或者罵戰,單純的就是我不喜歡 JPA 。沒錯,就是這麼 Real。

說到 Java 開發,涉及到資料庫訪問的,主要就兩種框架,一個是 MyBatis ,另一個就是 JPA。據說是國外 JPA 用的比較多,國內 MyBatis 用的比較多。國內為什麼 MyBatis 用的多呢,傳說是因為整個阿里系都用它。

JPA 全稱是Java 持久化 API ,它的目的就是幫助我們提高開發效率,它的核心是 Java持久化查詢語言 (JPQL),對儲存在關係資料庫中的實體進行查詢。在語法上類似於SQL查詢,但是操作的是實體物件而不是直接對資料庫表進行操作。(摘自 wiki)

使用 JPA 開發的流程如下:
1、將資料庫表對映到專案實體中
2、生成對應的 Repository
3、實現 Service ,Service 中呼叫 Repository
JPA 幫你省事兒的地方就在 Repository 裡,對於那些比較簡單的邏輯,比如單表查詢,直接根據名字就可以實現查詢邏輯。對於大部分查詢來說,真的很省事兒。但剛開始用的時候,確實感覺有些莫名其妙。

確實如此,如果你用過 JPA ,有些時候它確實對開發效率有很大提升,JPA 想要做的就是儘量讓你少寫 sql,甚至不寫 sql。基於這種思想,JPA 實現了它自己的一套語法、註解規則。

JPA 要用各種註解配合來實現資料實體間的一對多、多對多等等的關聯關係。正因為這樣,我覺得實體變得不單純是實體,而是摻雜的邏輯在裡面,也增加了實體的複雜度,對於比較複雜的業務來說,很容易造成實體間直接或間接的迴圈引用。

你如果想用 JPA,除了要掌握各種註解外,對於稍微複雜的查詢,還要掌握它的那套寫法,比如下面這種程式碼:

    Specification<CmContent> specification = (root, criteriaQuery, criteriaBuilder) -> {
            Predicate p = criteriaBuilder.equal(root.get("deleted").as(Boolean.class), false);
            Predicate news = criteriaBuilder.equal(root.get("cntntType"), ContentType.CNTNTTP_NEWS.name());
            Predicate salon = criteriaBuilder.equal(root.get("cntntType"), ContentType.CNTNTTP_SALON.name());
            Predicate type = criteriaBuilder.or(news, salon);
        ...

而且你想要實現一個 join 查詢也是夠費勁的,除了要寫上面那套程式碼外,還要在實體上做手腳,想到就想哭,有沒有。難道直接寫個 sql 不好嗎,為什麼要這麼糟蹋自己。

還有一點,JPA 有些註解用上了之後會影響到資料庫層面,比方說關鍵外來鍵的註解,如果你用預設設定,這個外來鍵就真的會應用到資料庫表裡,在表上建外來鍵。還有其他的一些 ORM 框架也是如此,這是我完全不能接受的,憑什麼,憑什麼在我的資料庫上改東西。

願我參與的專案中沒有 JPA。公司有個專案用到了 JPA ,我也參與了一部分,寫的程式碼不算多,除了令我頭疼之外,沒有體會到 JPA 的半點好處,這其中當然很可能是由於我的水平有限,或者說我寫的 JPA 程式碼不夠多,或者我根本沒有領會到 JPA 的精髓所在。總之不管怎麼樣,對不起,願我不會再碰到 JPA。

當然這麼說肯定是有失偏頗,有些同學可能會對此嗤之以鼻。沒錯,有同事就是這樣說的:事物存在即合理,JPA 這麼多年了,如果不好用怎麼會還有這麼多人用,而且國外 JPA 使用者眾多,難道人家都有問題。

如果只是簡單的專案,業務一點也不復雜,不復雜到連個 join 都沒有的專案,可以用 JPA ,其他的情況下,真的不用它最好。用 JPA 的感覺就像是被綁上了手腳,失去了自由。不自由,毋寧死。縱使千般好,少了自由,我就拒絕它。而 MyBatis 恰恰就是給開發者自由的一個框架。

還是那句話,不自由,毋寧死。這是第一個,恐怕也是最後一個用 JPA 的專案了。

不要吝惜你的「推薦」呦

歡迎關注,不定期更新本系列和其他文章
古時的風箏 ,進入公眾號可以加入交流群