一、Hibernate是JDBC的輕量級的對象封裝,它是一個獨(dú)立的對象持久層框架,和App Server,和EJB沒有什么必然的聯(lián)系。Hibernate可以用在任何JDBC可以使用的場合,例如Java應(yīng)用程序的數(shù)據(jù)庫訪問代碼,DAO接口的實(shí)現(xiàn)類,甚至可以是BMP里面的訪問數(shù)據(jù)庫的代碼。從這個意義上來說,Hibernate和EB不是一個范疇的東西,也不存在非此即彼的關(guān)系。二、Hibernate是一個和JDBC密切關(guān)聯(lián)的框架,所以Hibernate的兼容性和JDBC驅(qū)動,和數(shù)據(jù)庫都有一定的關(guān)系,但是和使用它的Java程序,和App Server沒有任何關(guān)系,也不存在兼容性問題。三、Hibernate不能用來直接和Entity Bean做對比,只有放在整個J2EE項(xiàng)目的框架中才能比較。并且即使是放在軟件整體框架中來看,Hibernate也是做為JDBC的替代者出現(xiàn)的,而不是Entity Bean的替代者出現(xiàn)的,讓我再列一次我已經(jīng)列n次的框架結(jié)構(gòu):傳統(tǒng)的架構(gòu):1) Session Bean <-> Entity Bean <-> DB為了解決性能障礙的替代架構(gòu):2) Session Bean <-> DAO <-> JDBC <-> DB使用Hibernate來提高上面架構(gòu)的開發(fā)效率的架構(gòu):3) Session Bean <-> DAO <-> Hibernate <-> DB就上面3個架構(gòu)來分析:1、內(nèi)存消耗:采用JDBC的架構(gòu)2無疑是最省內(nèi)存的,Hibernate的架構(gòu)3次之,EB的架構(gòu)1最差。2、運(yùn)行效率:如果JDBC的代碼寫的非常優(yōu)化,那么JDBC架構(gòu)運(yùn)行效率最高,但是實(shí)際項(xiàng)目中,這一點(diǎn)幾乎做不到,這需要程序員非常精通JDBC,運(yùn)用Batch語句,調(diào)整PreapredStatement的Batch Size和Fetch Size等參數(shù),以及在必要的情況下采用結(jié)果集cache等等。而一般情況下程序員是做不到這一點(diǎn)的。因此Hibernate架構(gòu)表現(xiàn)出最快的運(yùn)行效率。EB的架構(gòu)效率會差的很遠(yuǎn)。3、開發(fā)效率:在有JBuilder的支持下以及簡單的項(xiàng)目,EB架構(gòu)開發(fā)效率最高,JDBC次之,Hibernate最差。但是在大的項(xiàng)目,特別是持久層關(guān)系映射很復(fù)雜的情況下,Hibernate效率高的驚人,JDBC次之,而EB架構(gòu)很可能會失敗。4、分布式,安全檢查,集群,負(fù)載均衡的支持由于有SB做為Facade,3個架構(gòu)沒有區(qū)別。四、EB和Hibernate學(xué)習(xí)難度在哪里?EB的難度在哪里?不在復(fù)雜的XML配置文件上,而在于EB運(yùn)用稍微不慎,就有嚴(yán)重的性能障礙。所以難在你需要學(xué)習(xí)很多EJB設(shè)計(jì)模式來避開性能問題,需要學(xué)習(xí)App Server和EB的配置來優(yōu)化EB的運(yùn)行效率。做EB的開發(fā)工作,程序員的大部分精力都被放到了EB的性能問題上了,反而沒有更多的精力關(guān)注本身就主要投入精力去考慮的對象持久層的設(shè)計(jì)上來。Hibernate難在哪里?不在Hibernate本身的復(fù)雜,實(shí)際上Hibernate非常的簡單,難在Hibernate太靈活了。當(dāng)你用EB來實(shí)現(xiàn)持久層的時候,你會發(fā)現(xiàn)EB實(shí)在是太笨拙了,笨拙到你根本沒有什么可以選擇的余地,所以你根本就不用花費(fèi)精力去設(shè)計(jì)方案,去平衡方案的好壞,去費(fèi)腦筋考慮選擇哪個方案,因?yàn)橹挥形ㄒ坏姆桨笖[在你面前,你只能這么做,沒得選擇。Hibernate相反,它太靈活了,相同的問題,你至少可以設(shè)計(jì)出十幾種方案來解決,所以特別的犯難,究竟用這個,還是用那個呢?這些方案之間到底有什么區(qū)別呢?他們的運(yùn)行原理有什么不同?運(yùn)行效率哪個比較好?光是主鍵生成,就有七八種方案供你選擇,你為難不為難?集合屬性可以用Set,可以用List,還可以用Bag,到底哪個效率高,你為難不為難?查詢可以用iterator,可以用list,哪個好,有什么區(qū)別?你為難不為難?復(fù)合主鍵你可以直接在hbm里面配置,也可以自定義CustomerType,哪種比較好些?你為難不為難?對于一個表,你可以選擇單一映射一個對象,也可以映射成父子對象,還可以映射成兩個1:1的對象,在什么情況下用哪種方案比較好,你為難不為難?這個列表可以一直開列下去,直到你不想再看下去為止。當(dāng)你面前擺著無數(shù)的眼花繚亂的方案的時候,你會覺得幸福呢?還是悲哀呢?如果你是一個負(fù)責(zé)的程序員,那么你一定會仔細(xì)研究每種方案的區(qū)別,每種方案的效率,每種方案的適用場合,你會覺得你已經(jīng)陷入進(jìn)去拔不出來了。如果是用EB,你第一秒種就已經(jīng)做出了決定,根本沒得選擇,比如說集合屬性,你只能用Collection,如果是Hibernate,你會在Bag,List和Set之間來回猶豫不決,甚至搞不清楚的話,程序都沒有辦法寫。