Hibernate確實功能強悍,但在易用性、性能上存在缺陷。如果團隊中沒有一個精通Hibernate的高手,不適合使用Hibernate。
1. 復雜的實體狀態
3種實體狀態的設計是種種復雜性問題的根源。在持久化狀態下不需要save就自動同步到數據庫既無必要又容易造成煩惱。
2. Lazy Load 與 Eager Load
Lazy Load的概念聽起來不錯,用起來就不那么妙了,也直接導致產生了Open Session In View這種妥協方案。此外,在domain類中定義的FetchType只針對get/load/loadAll有效,對Query是無效的,需要再次定義。
3. Open Session In View
Lazy Load引發的一個有較多副作用的解決方案。
4. 級聯
級聯是一個很好很OO的概念,但往往增加了復雜度。
5. 批量更新與緩存不一致
Hibernate引入了一級緩存和二級緩存,提供了性能的同時帶來了緩存一致性的問題。批量更新或者其他系統對數據庫的更新容易造成緩存不一致。
6. 配置繁瑣
Hibernate最初只能使用xml進行配置,后來終于引入了Annotation和CoC(約定優于配置)來簡化配置,但這種變革并不徹底。Hibernate默認把userName映射userName,但實際開發中,把userName映射為user_name的情況更多些。
7. HQL
HQL是一個類SQL對象查詢語言,但正是因為HQL與SQL的相似性,往往容易造成混淆,同時HQL難以調試,本質創建了一種語言,增加學習成本。
8. 太多的查詢方案
HQL、QBC、SQL,就不能統一點,簡潔點?
9. N+1次查詢
10. 性能問題
總之,Hibernate立足于作一個完整的自動化的能夠適應各種環境的ORM,因此帶來了100%的復雜性。但我們實際需要的只是一個簡單的能夠以20%時間解決80%問題的框架,具有對象-關系映射,能自動生成SQL,能夠讓新手盡快工作就足夠了,也許ActiveRecord是一個選擇。