俺是很老土的,由于項目需要,現(xiàn)在才開始學習Hibernate。其實Hibernate剛出來的時候,只是大概了解了一下,知道這是一個O/R Mapping的框架。但是具體怎么用,能夠做到什么樣子,沒有一個具體的認識。現(xiàn)在從頭學起,按照《Hibernate參考手冊》提供的例子Step by Step做。做到Person和Event關聯(lián)的時候,手冊上給出的代碼如下:
Session s = HibernateUtil.getSessionFactory().getCurrentSession(); |
很簡單,很優(yōu)美的代碼哦,看起來很OO。這個代碼實現(xiàn)的需求也很簡單,就是將一個Person和一個Event關聯(lián)起來。
但是當我看到輸出的SQL語句時就愣住了:
Hibernate: |
姑且先不評價Hibernate生成的SQL語句的效率如何,就這個功能需求而言,映射到數(shù)據(jù)庫上的操作就是在T_PERSON_EVENT表中插入一行。但是Hibernate卻執(zhí)行了3個SQL語句!如果只是在寫一段Demo的代碼,這樣無所謂,但是如果是真的在有大量數(shù)據(jù)的生產(chǎn)系統(tǒng)上運行的話,我相信前面兩個SELECT語句的消耗會比最后一個INSERT語句多得多。請不要對我說:可以在硬件上優(yōu)化,可以在數(shù)據(jù)庫進行優(yōu)化。這個不是同一個問題。做為程序而言,應該是力求準確,該做的一樣都不能少,不必要的就絕對不要做。其實無論是原來的結構化編程還是現(xiàn)在的OO編程,一個函數(shù)或者一個方法,都應該是做且僅作一件事,越靠近底層邏輯的地方越應該這樣。尤其是在中國特色的系統(tǒng)中,典型的特點就是數(shù)據(jù)量大+業(yè)務復雜。在東北某省移動公司的BOSS系統(tǒng),有幾個主要的服務每天的調(diào)用量在3000萬(每個服務,他們的服務器上有大概20個這樣的服務)以上,在月底和月初的時候能夠達到5000萬甚至更高,但是服務的執(zhí)行時間保持在0.02s-0.05s之間,這個當然和數(shù)據(jù)庫設計和優(yōu)化有關,但是我無法想象如果在一件簡單的事情之外做一些不必要的事情會有怎樣的結果。在南方的某移動公司,用戶量已經(jīng)達到3000萬,他們的系統(tǒng)指導思想就是:用最簡單的技術去做最復雜的事情。
Hibernate的擁護者會說,O/R Mapping的框架降低了程序員的門檻,不用去熟悉SQL。難道HQL就比SQL真的簡單很多么?再說了,SQL是必須的基本功,就好像能夠熟練使用操作系統(tǒng)是每個程序員的基本功一樣。因為現(xiàn)在成熟的主流數(shù)據(jù)庫都是關系型的,這是根本。這也是為什么O/R Mapping的框架運行起來總是很奇怪一樣,因為從根上是關系型的,要想轉(zhuǎn)化成OO,必然就有一些很別扭的東西。以上面的例子看,如果單純看代碼,都能夠明白是要給Person和Event建立映射,不需要其它的東西,因為personId和eventId都已經(jīng)有了。但是Hibernate不理解,他也沒有辦法理解。
有朋友說,使用Hibernate能夠便于團隊協(xié)作。其實團隊協(xié)作也好,系統(tǒng)的可擴展性、可維護性也好,和你用不用Hibernate完全不相關。關鍵是看你的設計,能否清晰的層次化、模塊化;管理上能否協(xié)調(diào)利用資源等其它因素。
我比較推崇WebLogic Workshop 8.1里面的Control/Database Control/Customer Control的設計思路(八卦一下,WebLogic Workshop的設計者之一來自MS,原來設計Visual Basic的,所以在Workshop里面有很多VBer熟悉的東西),直接在方法的上面用Annotation的方式編寫SQL語句,支持命名參數(shù)。在編譯之后成為無狀態(tài)的Session Bean。自定義Control(可以認為是業(yè)務邏輯層)負責事務控制,很好用。
喜聞iBATIS也是這種思路的(自己寫SQL語句),看來要學學iBATIS哦。
技術沒有絕對的好與壞之分,只有適合與不適合之分。我覺得Hibernate并不是很適合大型、大量數(shù)據(jù)的、復雜數(shù)據(jù)關系的應用。如果我是客戶,我需要的是一個準確滿足需求,高效、穩(wěn)定、易于擴展的系統(tǒng),我不會關心你用的是什么技術(收費的東東另當別論,呵呵)。
以上是一個Hibernate初學者的看法,歡迎大家不吝賜教。
在google這個話題的時候,看到了另外的一篇帖子,和我的想法有點接近,原文在:http://www.jdon.com/jivejdon/thread/31879.html
作者drinkjava,內(nèi)容抄錄如下:
注: Hibernate的復雜性是人盡皆知,想問一下Hibernate的退化用法,在JAVA***上發(fā)過這個貼子討教,http://www.java***.com/topic/82107 <hibernate-mapping>
以下為JAVA***上的回答 drinkjava回答:答非所問,離題太遠。 引用 drinkjava回答:你根本就沒看明白這個貼子的觀點,我的意思是完全不用OO思想,只是將Hibernate當作一個比jdbc順手點的工具而已,我用關系數(shù)據(jù)庫好多年了,也開發(fā)過上百個表的應用,不用OO不也照樣做挺好?JDBC不行,可也沒人說不準用JDBC吧? -------------------------------------- 引用 drinkjava回答:同上,不是我沒理解,而是本來就沒打算采用“對象模型” -> “關系模型”,而是直接一個表對應一個類,走的是"關系模型"的路子。 -------------------------------------- 引用 drinkjava回答: 咱笨,用不好關聯(lián)映射,怕出錯,所以干脆不用它,可關系模型咱還是很精通的,所有的關系就交給數(shù)據(jù)庫去約束它好了。至于為什么還要用Hibernate,是相比JDBC和ibatis來說的:不用寫很多SQL,有緩存,跨數(shù)據(jù)庫,支持分頁,Spring支持,總之好處一言難盡啊... -------------------------------------- 引用 drinkjava回答: 不知你是為了OO而開發(fā),還是為了開發(fā)而OO? -------------------------------------- 引用 drinkjava回答: 不會這么恐怖吧?Hibernate很能干的,你google一下“hibernate多表查詢”就知道了。 -------------------------------------- 引用 drinkjava回答: 可見笨人不只我一個啊,這個居然用了2年。Hibernate的這種用法確實很另類,與它誕生的初衷可說是背道而馳,但事實上,這種方式程序跑起來絕對沒問題,問題是這種用法能否被團隊接受,讓我用起來心里有個底,這才是我發(fā)貼詢問的原因。光一個人私底下用,當然沒人會來說三道四,問題是能不能引入到團隊開發(fā)中,作為一種替代JDBC的簡易方案,而不是被團隊中的高手當作異已一棒子打死,因為通常一提到Hibernate大家就會聯(lián)想到ORM,這確實是一個很容易陷入的思維慣性,事實上,前面幾個回貼都是這樣,也不想想貼子要表達的是什么,就開始反駁了。 |