hibernate 我好久都沒有用了,最後一次用應該是3年前的一個企業項目,決定採用hibernate的並非我,是我領導,我只是開發者。我所受的罪領導並不知道。正 如個人每一個hibernate項目那樣,每次我都是用的提心吊膽。儘管我從ejb1.1到hiberate,而後再到jpa都經歷過,這種一脈相承的技術 我瞭解和應用了有14年,但我仍是不敢聲稱精通OR Mapping,尤爲是最近hibernate版本又都了些新概念和新Annotation,讓我還以爲我是個hibernate新手:OR Mapping 也許就是個DAO錯誤的方向。 java
讓我來吐槽一下hibernate這種DAO工具,並提一下我認爲完美的DAO工具。
槽點一 容器設計的敗筆。 系統的核心是模型,也就是JavaBean,使用hiberante的項目,JavaBean被持久化容器劫持這是第一個槽點。儘管對模型操做,在容器的 幫助下,能很快映射到數據庫操做,然而,如今越多越多的DAO框架都避免設計容器,就算是JPA規範,也只聲稱了是個API,而再也不提持久化容器了,由於 持久化容器已經不得人心了. 如下是使用hibernate常常出現的問題(但不限於下面幾個)
1 容器內,對模型的操做我不必定得映射到數據庫裏,可容器會強制
2 對象在容器內,一切操做都很順利,但出了容器,會有各類hibernate異常。須知應用並不僅有hibernate。
3 修改一個對象的屬性,必須先從數據庫load進來,成爲容器管理對象,才能修改
槽點二之hierbnate能提升生產力? 我早期接觸hb,並無被所謂的容器託管Bean所吸引(上面已經說了,實際上這是個高級陷阱),我只以爲之後添加,修改都只須要調用一下HB的api就 能夠了,就算是查詢,也貌似很方便,有load的方法。如今看來,這些功能,幾乎全部的dao框架,全部公司本身的dao工具都有,我在2002年就作過 最先的dao工具,並能自動生成dao,javabean.如今,我在beetl基礎上,作了更好的beetlsql,也徹底具有這種入門級功能。 吐槽hibenate並不能提升生產力,是由於其餘功能提供的太容易用錯和致使效率不高了,如下是hibernate效率不高的幾個方面(但不限於如下倆個)
1 不可控的生成sql,每一個用過hibernate的人都見只有一次api調用,多是one2many,也多是lazylaod,但控制檯滿屏的輸出 sql者狀況,這致使性能降低,你能夠說這是開發人員不精通致使的,但是,HB爲何要提供這種手段讓開人員走到這一步,好的工具應該爲程序員提供便利, 阻止程序員犯錯。
2 難以調試的HQL。若是你須要獲得數據庫專家支持,數據庫人員會拒絕你給他的HQL,他須要的是SQL,數據庫也須要的是SQL。所幸我項目中沒有人打算 給DBA培訓HQL語句(這太瘋狂了,DBA估計會暴動),HQL在我看來就是一個很雞肋的功能。若是純粹是爲了跨數據庫平臺,不一樣DAO框架都有不一樣方 案,好比beetlsql就共用的sql語句放一個地方,數據庫特定sql語句放到指定地方.常規的翻頁,序列等特性,經過方言實現類就解決了。
槽點三:annotation表達力不足, 以fetch來講,我有的業務須要eger加載,有的業務須要lazy加載,hibernate顯然作不到,惟一的解決方法就是加入更多的新 annotation來表達,若是還不作到,就讓annotation具有腳本或者sql功能。可問題來了,這樣的極限方式不就是咱們屬性的程序語 言+sql 方式嗎。 hiberante如今是5.0也許到了25.0版本後,他可能真的是一門語言+sql的工具了,但這樣有什麼意義呢。 我認爲annotation,最多隻能描述表映射就能夠了。不少其餘框架就是這麼作的。以下是一些常常的槽點(但不限於如下三個槽點):
1 fetch 模式 根據業務來的,但annotation只能一種,我選用哪一種都不合適
2 個人數據庫之間表關係並不嚴格(這常見),致使hibernate 都啓動不了
3 我想敏捷開發,把已經肯定的作出來,但hibernate要求我有完整的模型,不然,都啓動不起來
大部分其餘dao框架都不會出現上面的問題。
槽點四:程序中的SQL是個重要資產,須要維護,但hibernate並無去作。HB 最先是隻有xml配置文件,做者認爲只要經過配置就能完成全部dao操做,可是後來發現不行,就又搞了一個HQL,結果發現HQL跟SQL徹底不能比,最 後支持Native SQL. 就算這樣的演進,但HB做者仍然沒有意識到SQL纔是DAO的核心, 須要重點維護。 這也是Mybatis,Beetlsql框架能讓你們接受並喜好的緣由。 經過Java拼接hql或者sql問題不大,無非是把數據庫調試好的的幾十行sql拆開拼接就行了。但這樣開發效率不高,更重要的是,維護效率低,一旦業 務有改動,sql機會不得不從新在java裏拼接。hibernate 原本應該像sql那樣提供sql拼接,但並無,反而是mybatis,beetlsql在這方便作的很好。 愈來愈多的人意識到hibernte是個問題,從而轉用了mybatis, jfinal,nutzdao,beetlsql 等這樣的開源dao工具,我認爲一個理想的dao工具,應該有以下功能是必須的: 1 好的dao工具,支持javabean模型 2 好的dao工具,在javabean基礎上,不能干涉javabean模型 3 支持sql的維護,如像beetlsql 那樣經過markdonw格式維護sql,或者像myabtis那樣經過xml維護 4 支持跨數據庫平臺 5 簡單的數據庫操做無需用戶開發,大部分dao工具都能作到這點,好比beetlsql支持新增,修改,根據模板修改,根據主鍵查詢,根據模板查詢等,至少40%的dao代碼都不須要重寫 6 代碼生成,好比生成javabean,生成dao代碼,生成查詢sql語句等 8 dao工具並不能要求數據庫徹底符合數據庫高級範式,也不要求程序徹底的OO。 7 最爲重要的是,dao工具必須是個工具,任由開發人員使用。