版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、struts+spring+hibernate 面試題集1 Action 是不是線程安全的?如果不是有什么方式可以保證Action 的線程安全?如果是,說(shuō)明原因 不是聲明局部變量,或者擴(kuò)展RequestProcessor ,讓每次都創(chuàng)建一個(gè)Action ,或者在spring中用 scope="prototype" 來(lái)管理2 .MVC分析一下struts是如何實(shí)現(xiàn)MVC勺 m: JavaBean 或結(jié)合 EJB 組件或者pojo 構(gòu)成c: Action 來(lái)實(shí)現(xiàn)v: 一組JSP文件及其標(biāo)簽構(gòu)成。3.struts 中的幾個(gè)關(guān)鍵對(duì)象的作用(說(shuō)說(shuō)幾個(gè)關(guān)鍵對(duì)象的作用)Action :控
2、制器類,ActionForm :表單對(duì)象,DynaValidatorForm :動(dòng)態(tài)form, ActonMapping:配置文件中action節(jié)點(diǎn)的信息4 .說(shuō)說(shuō)AOPffi IOC的概念以及在spring中是如何應(yīng)用的AOP面向方面編程,ioc :依賴注入;聲明式事務(wù)和編程式事務(wù)積極一些通用部分5 .Hibernate 有哪幾種查詢數(shù)據(jù)的方式hql 查詢, sql 查詢,條件查詢6 .load() 和 get() 的區(qū)別hibernate 對(duì)于 load 方法認(rèn)為該數(shù)據(jù)在數(shù)據(jù)庫(kù)中一定存在,可以放心的使用代理來(lái)延遲加載, load 默認(rèn)支持延遲加載,在用到對(duì)象中的其他屬性數(shù)據(jù)時(shí)才查詢數(shù)據(jù)庫(kù),
3、但是萬(wàn)一數(shù)據(jù)庫(kù)中不存在該記錄,只能拋異常ObjectNotFoundEcception ;所說(shuō)的load 方法拋異常是指在使用該對(duì)象的數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)中不存在該數(shù)據(jù)時(shí)拋異常,而不是在創(chuàng)建這個(gè)對(duì)象時(shí)。由于session 中的緩存對(duì)于hibernate 來(lái)說(shuō)是個(gè)相當(dāng)廉價(jià)的資源,所以在load 時(shí)會(huì)先查一下session 緩存看看該id 對(duì)應(yīng)的對(duì)象是否存在,不存在則創(chuàng)建代理(load 時(shí)候之查詢一級(jí)緩存,不存在則創(chuàng)建代理)。 get() 現(xiàn)在一級(jí)緩存找,沒(méi)有就去二級(jí)緩存找,沒(méi)有就去數(shù)據(jù)庫(kù)找,沒(méi)有就返回null ;而對(duì)于get 方法, hibernate 一定要獲取到真實(shí)的數(shù)據(jù),否則返回null 。7
4、. 談?wù)?hibernate 的延遲加載和openSessionInView延遲加載要在session范圍內(nèi),用到的時(shí)候再加載;opensessioninview 是在web層寫(xiě)了一個(gè)filter 來(lái)打開(kāi)和關(guān)閉session ,這樣就表示在一次request 過(guò)程中 session 一直開(kāi)著,保證了延遲加載在 session 中的這個(gè)前提。8 .spring 的事務(wù)有幾種方式?談?wù)剆pring 事務(wù)的隔離級(jí)別和傳播行為。聲明事務(wù)和編程事務(wù)隔離級(jí)別:- DEFAUL使用數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別- READ_UNCOMMITTED現(xiàn)臟讀,不可重復(fù)讀和幻影讀問(wèn)題- READ_COMMITTED現(xiàn)重復(fù)讀和
5、幻影讀- REPEATABLE_READ現(xiàn)幻影讀- SERIALIZABLE1安全,但是代價(jià)最大,性能影響極其嚴(yán)重和傳播行:- REQUIRED在事務(wù)就融入該事務(wù),不存在就創(chuàng)建事務(wù)- SUPPORTS在事務(wù)就融入事務(wù),不存在則不創(chuàng)建事務(wù)- MANDATORY事務(wù)則融入該事務(wù),不存在,拋異常- REQUIRES_NEW創(chuàng)建新事務(wù)- NOT_SUPPORTED事務(wù)則掛起,一直執(zhí)行非事務(wù)操作- NEVER、是執(zhí)行非事務(wù),如果當(dāng)前存在事務(wù)則拋異常- NESTE蹴入式事務(wù)9.Hibernate 中的 update()和 saveOrUpdate()的區(qū)另加摘自 hibernate 說(shuō)明文檔:saveOr
6、Update() 做下面的事:如果對(duì)象已經(jīng)在本session 中持久化了,不做任何事如果另一個(gè)與本session 關(guān)聯(lián)的對(duì)象擁有相同的持久化標(biāo)識(shí)(identifier) ,拋出一個(gè)異常如果對(duì)象沒(méi)有持久化標(biāo)識(shí)(identifier) 屬性,對(duì)其調(diào)用save()如果對(duì)象的持久標(biāo)識(shí)(identifier) 表明其是一個(gè)新實(shí)例化的對(duì)象,對(duì)其調(diào)用save()如果對(duì)象是附帶版本信息的(通過(guò)<version> 或<timestamp>)并且版本屬性的值表明其是一個(gè)新實(shí)例化的對(duì)象,save() 它。 否則 update() 這個(gè)對(duì)象10.Spring對(duì)多種ORM1架提供了很好的支持,簡(jiǎn)
7、單描述在Spring中使用Hibernate的方 法,并結(jié)合事務(wù)管理。getHiberanteTemplate 里面提供了save, update, delete , find 等方法。簡(jiǎn)單說(shuō)一個(gè):如果配置了聲明式事務(wù),當(dāng)執(zhí)行g(shù)etHibernateTemplate 的各種方法的時(shí)候,事務(wù)會(huì) 自動(dòng)被加載如果沒(méi)有配置事務(wù),那么以上操作不會(huì)真正的被同步到數(shù)據(jù)庫(kù),除非配置了hibernate 的 autocommit=true8.spring 的事務(wù)有幾種方式?談?wù)剆pring 事務(wù)的隔離級(jí)別和傳播行為。spring 事務(wù)分兩種形式,聲明式事務(wù)和編程式事務(wù),spring 提供了一個(gè)事務(wù)的接口Palt
8、formTractionManager 接口,針對(duì)不同的事務(wù),spring 進(jìn)行了不同的實(shí)現(xiàn), 對(duì)hibernate 事務(wù)的實(shí)現(xiàn) HIbernateTractionManager, 對(duì) JDBC的 JdbcTractionManager ,DataSourceTractionManager 以及 JdoTractionManager 。接口 platformTractionManager 提供了三個(gè)方法,獲取事務(wù),提交和回滾的方法。*分享面試題二】Spring,hibernate,struts 的面試筆試題(含答案)(聲明:這里不是為其他商業(yè)利益,是為學(xué)習(xí)討論使用)【鄭重聲明】:?jiǎn)渭兘臃謱⒈粍h
9、帖,希望大家有自己的感觸Hibernate 工作原理及為什么要用?原理:1. 讀取并解析配置文件2. 讀取并解析映射信息,創(chuàng)建SessionFactory3. 打開(kāi) Sesssion4. 創(chuàng)建事務(wù)Transaction5. 持久化操作6. 提交事務(wù)7. 關(guān)閉Session8. 關(guān)閉SesstionFactory為什么要用:1. 對(duì)JDBCJ問(wèn)數(shù)據(jù)庫(kù)的代碼做了封裝,大大簡(jiǎn)化了數(shù)據(jù)訪問(wèn)層繁瑣的重復(fù)性代碼。2. Hibernate是一個(gè)基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的 ORM;現(xiàn)。他很大程 度的簡(jiǎn)化DAOB的編碼工作3. hibernate 使用Java 反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來(lái)實(shí)
10、現(xiàn)透明性。4. hibernate 的性能非常好,因?yàn)樗莻€(gè)輕量級(jí)框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。5. Hibernate 是如何延遲加載?1 Hibernate2延遲加載實(shí)現(xiàn):a)實(shí)體對(duì)象b)集合(Collection )2 Hibernate3 提供了屬性的延遲加載功能 當(dāng) Hibernate 在查詢數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒(méi)有存在與內(nèi)存中,當(dāng)程序真正對(duì)數(shù)據(jù)的操作時(shí),對(duì)象才存在與內(nèi)存中,就實(shí)現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開(kāi)銷,從而提高了服務(wù)器的性能。3 Hibernate 中怎樣實(shí)現(xiàn)類之間的關(guān)系?(如:一對(duì)多、多對(duì)多的關(guān)系)類與類之間的關(guān)系主要
11、體現(xiàn)在表與表之間的關(guān)系進(jìn)行操作,它們都市對(duì)對(duì)象進(jìn)行操作,我們程序中把所有的表與類都映射在一起,它們通過(guò)配置文件中的many-to-one 、 one-to-many、 many-to-many、4 說(shuō)下 Hibernate 的緩存機(jī)制l) 內(nèi)部緩存存在Hibernate 中又叫一級(jí)緩存,屬于應(yīng)用事物級(jí)緩存m) 二級(jí)緩存:n) 應(yīng)用及緩存o) 分布式緩存條件:數(shù)據(jù)不會(huì)被第三方修改、數(shù)據(jù)大小在可接受范圍、數(shù)據(jù)更新頻率低、同一數(shù)據(jù)被系統(tǒng)頻繁使用、非關(guān)鍵數(shù)據(jù)p) 第三方緩存的實(shí)現(xiàn)5 Hibernate 的查詢方式Sql 、 Criteria,object comptositionHql:1、 屬性查詢
12、2、 參數(shù)查詢、命名參數(shù)查詢3、 關(guān)聯(lián)查詢4、 分頁(yè)查詢5、 統(tǒng)計(jì)函數(shù)6 如何優(yōu)化Hibernate ?1. 使用雙向一對(duì)多關(guān)聯(lián),不使用單向一對(duì)多2. 靈活使用單向一對(duì)多關(guān)聯(lián)3. 不用一對(duì)一,用多對(duì)一取代4. 配置對(duì)象緩存,不使用集合緩存5. 一對(duì)多集合使用Bag, 多對(duì)多集合使用Set6. 繼承類使用顯式多態(tài)7. 表字段要少,表關(guān)聯(lián)不要怕多,有二級(jí)緩存撐腰7 Struts 工作機(jī)制?為什么要使用Struts ?工作機(jī)制:Struts 的工作流程:在web應(yīng)用啟動(dòng)時(shí)就會(huì)加載初始化 ActionServlet,ActionServlet 從 struts-config.xml 文件中讀取配置信息
13、, 把它們存放到各種配置對(duì)象當(dāng) ActionServlet 接收到一個(gè)客戶請(qǐng)求時(shí), 將執(zhí)行如下流程.- (1) 檢索和用戶請(qǐng)求匹配的ActionMapping 實(shí)例 , 如果不存在, 就返回請(qǐng)求路徑無(wú)效信息;- (2) 如果 ActionForm 實(shí)例不存在, 就創(chuàng)建一個(gè)ActionForm 對(duì)象 , 把客戶提交的表單數(shù)據(jù)保存到ActionForm 對(duì)象中 ;- (3) 根據(jù)配置信息決定是否需要表單驗(yàn)證. 如果需要驗(yàn)證, 就調(diào)用 ActionForm 的validate() 方法 ;- (4) 如果 ActionForm 的 validate() 方法返回null 或返回一個(gè)不包含Action
14、Message的 ActuibErrors 對(duì)象 , 就表示表單驗(yàn)證成功;- (5)ActionServlet 根據(jù) ActionMapping 所包含的映射信息決定將請(qǐng)求轉(zhuǎn)發(fā)給哪個(gè)Action, 如果相應(yīng)的Action 實(shí)例不存在, 就先創(chuàng)建這個(gè)實(shí)例, 然后調(diào)用 Action 的 execute() 方法 ;- (6)Action 的 execute() 方法返回一個(gè)ActionForward 對(duì)象 ,ActionServlet 在把客戶請(qǐng)求轉(zhuǎn)發(fā)給 ActionForward對(duì)象指向的JSP組件;- (7)ActionForward 對(duì)象指向JSP組件生成動(dòng)態(tài)網(wǎng)頁(yè),返回給客戶;為什么要用:J
15、SP、Servlet、JavaBean技術(shù)的出現(xiàn)給我們構(gòu)建強(qiáng)大的企業(yè)應(yīng)用系統(tǒng)提供了可能。但用這些技術(shù)構(gòu)建的系統(tǒng)非常的繁亂,所以在此之上,我們需要一個(gè)規(guī)則、一個(gè)把這些技術(shù)組織起來(lái)的規(guī)則,這就是框架,Struts 便應(yīng)運(yùn)而生?;?Struts 開(kāi)發(fā)的應(yīng)用由3 類組件構(gòu)成:控制器組件、模型組件、視圖組件8 Struts 的 validate 框架是如何驗(yàn)證的?在struts配置文件中配置具體的錯(cuò)誤提示,再在FormBean中的validate。方法具體調(diào)用9 說(shuō)下 Struts 的設(shè)計(jì)模式MVC奠式:web應(yīng)用程序啟動(dòng)時(shí)就會(huì)加載并初始化 ActionServler。用戶提交表單時(shí),一個(gè)配置好的Ac
16、tionForm 對(duì)象被創(chuàng)建,并被填入表單相應(yīng)的數(shù)據(jù), ActionServler 根據(jù)Struts-config.xml 文件配置好的設(shè)置決定是否需要表單驗(yàn)證,如果需要就調(diào)用ActionForm 的 Validate ()驗(yàn)證后選擇將請(qǐng)求發(fā)送到哪個(gè)Action ,如果 Action 不存在,ActionServlet 會(huì)先創(chuàng)建這個(gè)對(duì)象,然后調(diào)用Action的execute ()方法。Execute ()從 ActionForm 對(duì)象中獲取數(shù)據(jù),完成業(yè)務(wù)邏輯,返回一個(gè)ActionForward 對(duì) 象,ActionServlet 再把客戶請(qǐng)求轉(zhuǎn)發(fā)給ActionForward 對(duì)象指定的jsp
17、組件, ActionForward對(duì)象指定的jsp 生成動(dòng) 態(tài)的網(wǎng)頁(yè),返回給客戶。10 spring 工作機(jī)制及為什么要用?1.spring mvc請(qǐng)所有的請(qǐng)求都提交給DispatcherServlet,它會(huì)委托應(yīng)用系統(tǒng)的其他模塊 負(fù)責(zé)負(fù)責(zé)對(duì)請(qǐng)求進(jìn)行真正的處理工作。2 .DispatcherServlet 查詢一個(gè)或多個(gè)HandlerMapping, 找到處理請(qǐng)求的Controller.3 .DispatcherServlet 請(qǐng)請(qǐng)求提交到目標(biāo)Controller4 .Controller 進(jìn)行業(yè)務(wù)邏輯處理后,會(huì)返回一個(gè)ModelAndView5 .Dispathcher 查詢一個(gè)或多個(gè) Vi
18、ewResolver視圖解析器,找到ModelAndView對(duì)象指定的 視圖對(duì)象6 . 視圖對(duì)象負(fù)責(zé)渲染返回給客戶端。為什么用:AOP 讓開(kāi)發(fā)人員可以創(chuàng)建非行為性的關(guān)注點(diǎn),稱為橫切關(guān)注點(diǎn),并將它們插入到應(yīng)用程序代碼中。使用AOP后,公共服務(wù)(比 如日志、持久性、事務(wù)等)就可以分解成方面并應(yīng)用到域?qū)ο笊?,同時(shí)不會(huì)增加域?qū)ο蟮膶?duì)象模型的復(fù)雜性。IOC 允許創(chuàng)建一個(gè)可以構(gòu)造對(duì)象的應(yīng)用環(huán)境,然后向這些對(duì)象傳遞它們的協(xié)作對(duì)象。正如單詞 倒置 所表明的,IOC就像反 過(guò)來(lái)的JNDI。沒(méi)有使用一堆抽象工廠、服務(wù)定位器、單元素(singleton )和直接構(gòu)造(straight construction )
19、,每一個(gè)對(duì)象都是用其協(xié)作對(duì)象構(gòu)造的。因此是由容器管理協(xié)作對(duì)象(collaborator ) 。Spring即使一個(gè)AOPI1架,也是一 IOC容器。Spring最好的地方是它有助于您替換對(duì)象有了 Spring ,只要用JavaBean 屬性和配置文件加入依賴性(協(xié)作對(duì)象)。然后可以很容易地在需要時(shí)替換具有類似接口的協(xié)作對(duì)象。Struts,Spring,Hibernate 優(yōu)缺點(diǎn)Struts跟Tomcat、Turbine等諸 多Apache項(xiàng)目一樣,是開(kāi)源軟件,這是它的一大優(yōu)點(diǎn)。使開(kāi)發(fā)者能更深入的了解其內(nèi)部實(shí)現(xiàn)機(jī)制。Struts 開(kāi)放源碼框架的創(chuàng)建是為了使開(kāi)發(fā)者在構(gòu)建基于Java Servlet
20、和JavaServer Pages (JSP)技術(shù)的 Web用時(shí)更加容易。Struts 框架為開(kāi)放者提供了一個(gè)統(tǒng)一的標(biāo)準(zhǔn)框架,通過(guò)使用Struts 作為基礎(chǔ),開(kāi)發(fā)者能夠更專注于應(yīng)用程序的商業(yè)邏輯。Struts 框架本身是使用Java Servlet 和 JavaServerPages技術(shù)的一種 Model-View-Controller (MVC 實(shí)現(xiàn).具體來(lái)講 ,Struts 的優(yōu)點(diǎn)有:1. 實(shí)現(xiàn)MVC1式,結(jié)構(gòu)清晰,使開(kāi)發(fā)者只關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn).2. 有豐富的tag 可以用 ,Struts 的標(biāo)記庫(kù)(Taglib) ,如能靈活動(dòng)用,則能大大提高開(kāi)發(fā)效率。另外,就目前國(guó)內(nèi)的JSP開(kāi)發(fā)者而言,
21、除了使用JSP自帶的常用標(biāo)記外,很少開(kāi)發(fā)自己的標(biāo)記,或許Struts 是一個(gè)很好的起點(diǎn)。3. 頁(yè)面導(dǎo)航 . 頁(yè)面導(dǎo)航將是今后的一個(gè)發(fā)展方向,事實(shí)上,這樣做,使系統(tǒng)的脈絡(luò)更加清晰。通過(guò)一個(gè)配置文件,即可把握整個(gè)系統(tǒng)各部分之間的聯(lián)系,這對(duì)于后期的維護(hù)有著莫大的好處。尤其是當(dāng)另一批開(kāi)發(fā)者接手這個(gè)項(xiàng)目時(shí),這種優(yōu)勢(shì)體現(xiàn)得更加明顯。4. 提供Exception 處理機(jī)制.5. 數(shù)據(jù)庫(kù)鏈接池管理6. 支持I18N缺點(diǎn) :一、轉(zhuǎn)到展示層時(shí),需要配置forward ,每一次轉(zhuǎn)到展示層,相信大多數(shù)都是直接轉(zhuǎn)到j(luò)sp ,而涉及到轉(zhuǎn)向,需要配置forward ,如果有十個(gè)展示層的jsp ,需要配置十次struts ,
22、而且還不包括有時(shí)候目錄、文件變更,需要重新修改forward ,注意,每次修改配置之后,要求重新部署整個(gè)項(xiàng)目,而tomcate 這樣的服務(wù)器,還必須重新啟動(dòng)服務(wù)器,如果業(yè)務(wù)變更復(fù)雜頻繁的系統(tǒng),這樣的操作簡(jiǎn)單不可想象?,F(xiàn)在就是這樣,幾十上百個(gè)人同時(shí)在線使用我們的系統(tǒng),大家可以想象一下,我的煩惱有多大。二、 Struts 的 Action 必需是 thread safe 方式,它僅僅允許一個(gè)實(shí)例去處理所有的請(qǐng)求。所以action 用到的所有的資源都必需統(tǒng)一同步,這個(gè)就引起了線程安全的問(wèn)題。三、測(cè)試不方便.Struts的每個(gè)Action都同Webg耦合在一起,這樣它的測(cè)試依賴于Web§器,
23、單元測(cè)試也很難實(shí)現(xiàn)。不過(guò)有一個(gè) Junit的擴(kuò)展工具Struts TestCase可以實(shí) 現(xiàn)它的單元測(cè)試。四、類型的轉(zhuǎn)換.Struts的FormBea甘巴所有的數(shù)據(jù)都作為String類型,它可以使用工具 Commons-Beanutils 進(jìn)行類型轉(zhuǎn)化。但它的轉(zhuǎn)化都是在Class 級(jí)別,而且轉(zhuǎn)化的類型是不可配置的。類型轉(zhuǎn)化時(shí)的錯(cuò)誤信息返回給用戶也是非常困難的。五、 對(duì) Servlet 的依賴性過(guò)強(qiáng). Struts 處理 Action 時(shí)必需要依賴ServletRequest 和ServletResponse ,所有它擺脫不了Servlet 容器。六、前端表達(dá)式語(yǔ)言方面.Struts集成了 JS
24、TL所以它主要使用JSTL的表達(dá)式語(yǔ)言來(lái)獲取數(shù)據(jù)??墒荍STL 的表達(dá)式語(yǔ)言在Collection 和索引屬性方面處理顯得很弱。7、 對(duì) Action 執(zhí)行的控制困難. Struts 創(chuàng)建一個(gè)Action ,如果想控制它的執(zhí)行順序?qū)?huì)非常困難。甚至你要重新去寫(xiě)Servlet 來(lái)實(shí)現(xiàn)你的這個(gè)功能需求。8、 對(duì) Action 執(zhí)行前和后的處理. Struts 處理 Action 的時(shí)候是基于class 的hierarchies ,很難在action 處理前和后進(jìn)行操作。9、 對(duì)事件支持不夠.在struts中,實(shí)際是一個(gè)表單Form對(duì)應(yīng)一個(gè)Action類(或DispatchAction) ,換一句話
25、說(shuō):在Struts 中實(shí)際是一個(gè)表單只能對(duì)應(yīng)一個(gè)事件,struts 這種事件方式稱為application event, application event 和 component event相比是一種粗粒度的事件。Struts 重要的表單對(duì)象ActionForm 是一種對(duì)象,它代表了一種應(yīng)用,這個(gè)對(duì)象中至少包含幾個(gè)字段,這些字段是Jsp 頁(yè)面表單中的input 字段,因?yàn)橐粋€(gè)表單對(duì)應(yīng)一個(gè)事件,所以,當(dāng)我們需要將事件粒度細(xì)化到表單中這些字段時(shí),也就是說(shuō),一個(gè)字段對(duì)應(yīng)一個(gè)事件時(shí),單純使用Struts 就不太可能,當(dāng)然通過(guò)結(jié)合JavaScript 也是可以轉(zhuǎn)彎實(shí)現(xiàn)的。2 HibernateHibe
26、rnate是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBG1行了非常輕量級(jí)的對(duì)象封裝,使得Java 程序員可以隨心所欲的使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。Hibernate可以應(yīng)用在任何使用JDBC勺場(chǎng)合,既可以在Java的客戶端程序?qū)嵱?,也可?在Servlet/JSP 的WetS用中使用,最具革命意義的是, Hibernate可以在應(yīng)用EJB的 J2EE架構(gòu)中取代CMP完成數(shù)據(jù)持久化的重任。大多數(shù)開(kāi)發(fā)機(jī)構(gòu)經(jīng)常采取創(chuàng)建各自獨(dú)立的數(shù)據(jù)持久層。一旦底層的數(shù)據(jù)結(jié)構(gòu)發(fā)生改變,那么修改應(yīng)用的其余部分使之適應(yīng)這種改變的代價(jià)將是十分巨大的。Hibernate 適時(shí)的填補(bǔ)了這一空白,它為Java 應(yīng)用提供了一個(gè)
27、易用的、高效率的對(duì)象關(guān)系映射框架。hibernate 是個(gè)輕量級(jí)的持久性框架,功能卻非常豐富。優(yōu)點(diǎn):a.Hibernate 使用 Java 反射機(jī)制而不是字節(jié)碼增強(qiáng)程序來(lái)實(shí)現(xiàn)透明性。b.Hibernate 的性能非常好,因?yàn)樗莻€(gè)輕量級(jí)框架。映射的靈活性很出色。c. 它支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。缺點(diǎn):它限制您所使用的對(duì)象模型。( 例如,一個(gè)持久性類不能映射到多個(gè)表) 其獨(dú)有的界面和可憐的市場(chǎng)份額也讓人不安,盡管如此,Hibernate 還是以其強(qiáng)大的發(fā)展動(dòng)力減輕了這些風(fēng)險(xiǎn)。其他的開(kāi)源持久性框架也有一些,不過(guò)都沒(méi)有Hibernate 這樣有市場(chǎng)沖擊力。上面回貼情緒有點(diǎn)激
28、動(dòng),希望諒解,我不是因?yàn)橛腥伺u(píng)Hibernate 而感到不快,而是因?yàn)樘永锩娴挠^點(diǎn)實(shí)在讓我覺(jué)得荒謬。不管覺(jué)得Hibernate 好也吧,不好也吧,我唯一覺(jué)得遺憾的是,在中文論壇里面找不到一個(gè)對(duì)Hibernate的真正高水平的評(píng)價(jià)。在TSS上有一個(gè)關(guān)于Hibernate 的 hot thread ,跟了幾百貼,其中包括Hibernate 作者 Gavin 和LiDO JDO的CTO對(duì)于JDO?口 Hibernate有過(guò)一些激烈的爭(zhēng)論,我曾經(jīng)耐心的看了一遍,仍然沒(méi)有發(fā)現(xiàn)針對(duì)Hibernate 真正有力的攻擊,那些所謂的攻擊無(wú)非針對(duì)Hibernate 沒(méi)有一個(gè)GUI的配置工具,沒(méi)有商業(yè)公司支持,
29、沒(méi)有標(biāo)準(zhǔn)化等等這些站不住腳的理由。補(bǔ)充幾點(diǎn)我的意見(jiàn):一、Hibernate是JDBC勺輕量級(jí)的對(duì)象封裝,它是一個(gè)獨(dú)立的對(duì)象持久層框架,和 App Server ,和EJB沒(méi)有什么必然的聯(lián)系。Hibernate可以用在任何JDBCT以使用的場(chǎng)合, 例如Java應(yīng)用程序的數(shù)據(jù)庫(kù)訪問(wèn)代碼,DAB口的實(shí)現(xiàn)類,甚至可以是BMP1面的訪問(wèn) 數(shù)據(jù)庫(kù)的代碼。從這個(gè)意義上來(lái)說(shuō),Hibernate和EB不是一個(gè)范疇的東西,也不存在非 此即彼的關(guān)系。二、Hibernate是一個(gè)和JDBCg切關(guān)聯(lián)的本g架,所以Hibernate的兼容性和JDBCS區(qū)動(dòng),和數(shù)據(jù)庫(kù)都有一定的關(guān)系,但是和使用它的Java 程序,和App
30、Server 沒(méi)有任何關(guān)系,也不存在兼容性問(wèn)題。三、Hibernate不能用來(lái)直接和Entity Bean做對(duì)比,只有放在整個(gè)J2EE項(xiàng)目的框架中 才能比較。并且即使是放在軟件整體框架中來(lái)看, 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使用 Hibern
31、ate 來(lái)提高上面架構(gòu)的開(kāi)發(fā)效率的架構(gòu):3) Session Bean <-> DAO<-> Hibernate <-> DB就上面 3 個(gè)架構(gòu)來(lái)分析:1、內(nèi)存消耗:采用JDBC勺架構(gòu)2無(wú)疑是最省內(nèi)存的,Hibernate的架構(gòu)3次之,EB的架 構(gòu) 1 最差。2、運(yùn)行效率:如果JDBC勺代碼寫(xiě)的非常優(yōu)化,那么JDBO構(gòu)運(yùn)行效率最高,但是實(shí)際 項(xiàng)目中,這一點(diǎn)幾乎做不到,這需要程序員非常精通JDBC運(yùn)用Batch語(yǔ)句,調(diào)整PreapredStatement 的 Batch Size 和 Fetch Size 等參數(shù),以及在必要的情況下采用結(jié)果集 cache 等等
32、。而一般情況下程序員是做不到這一點(diǎn)的。因此Hibernate 架構(gòu)表現(xiàn)出最快的運(yùn)行效率。EB的架構(gòu)效率會(huì)差的很遠(yuǎn)。3、開(kāi)發(fā)效率:在有JBuilder的支持下以及簡(jiǎn)單的項(xiàng)目,EB架構(gòu)開(kāi)發(fā)效率最高,JDBC欠之, Hibernate 最差。但是在大的項(xiàng)目,特別是持久層關(guān)系映射很復(fù)雜的情況下,Hibernate效率高的驚人,JDBCfc之,而EB架構(gòu)很可能會(huì)失敗。4、分布式,安全檢查,集群,負(fù)載均衡的支持由于有SB做為Facade, 3個(gè)架構(gòu)沒(méi)有區(qū)別。四、EB和Hibernate學(xué)習(xí)難度在哪里?EB的難度在哪里?不在復(fù)雜的XMLE置文件上,而在于EB運(yùn)用稍微不慎,就有嚴(yán)重的性 能障礙。所以難在你需要
33、學(xué)習(xí)很多 EJB設(shè)計(jì)模式來(lái)避開(kāi)性能問(wèn)題,需 要學(xué)習(xí)App Server 和EB的配置來(lái)優(yōu)化EB的運(yùn)行效率。做EB的開(kāi)發(fā)工作,程序員的大部分精力都被放到了 EB的性能問(wèn)題上了,反而沒(méi)有更多的精力關(guān)注本身就主要投入精力去考慮的對(duì)象持久層的設(shè)計(jì)上來(lái)。Hibernate 難在哪里?不在Hibernate 本身的復(fù)雜,實(shí)際上Hibernate 非常的簡(jiǎn)單,難在Hibernate 太靈活了。當(dāng)你用EB來(lái)實(shí)現(xiàn)持久層的時(shí)候,你會(huì)發(fā)現(xiàn) EB實(shí)在是太笨拙了,笨拙到你根本沒(méi)有什么可以選擇的余地,所以你根本就不用花費(fèi)精力去設(shè)計(jì)方案,去平衡方案的好壞,去費(fèi)腦筋考慮選擇哪個(gè)方案,因?yàn)橹挥形ㄒ坏姆桨笖[在你面前,你只能這么做
34、,沒(méi)得選擇。Hibernate 相反,它太靈活了,相同的問(wèn)題,你至少可以設(shè)計(jì)出十幾種方案來(lái)解決,所以特別的犯難,究竟用這個(gè),還是用那個(gè)呢?這些方案之間到底有什么區(qū)別呢?他們的運(yùn)行原理有什么不同?運(yùn)行效率哪個(gè)比較好?光是主鍵生成,就有七八種方案供你選擇,你為難不為難?集合屬性可以用 Set,可以用List ,還可以用Bag,到底哪個(gè)效率高,你為難不為難?查詢可以用iterator ,可以用list ,哪個(gè)好,有什么區(qū)別?你為難不為難?復(fù)合主鍵你可以直接在hbm里面配置,也可以自定義 CustomerType,哪種比較好些?你為難不為難?對(duì)于一個(gè)表,你可以選擇單一映射一個(gè)對(duì)象,也可以映射成父子對(duì)象,還可以映射成兩個(gè)1:1 的對(duì)象,在什么情況下用哪種方案比較好,你為難不為難?這個(gè)列表可以一直開(kāi)列下去,直到你不想再看下去為止。當(dāng)你面前擺著無(wú)數(shù)的眼花繚亂的方案的時(shí)候,你會(huì)覺(jué)得幸福呢?還是悲哀呢?如果你是一個(gè)負(fù)責(zé)的程序員,那么你一定會(huì)仔細(xì)研究每種方案的區(qū)別,每種方案的效率,每種方案的適用場(chǎng)合,你會(huì)覺(jué)得你已經(jīng)陷入進(jìn)去拔不出來(lái)了。如果是用 EB你第一秒種就已經(jīng)做出了決 定,根本沒(méi)得選擇,比如說(shuō)集合屬性,你只能用Collec
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024施工混凝土合同范本
- 2024年中英文對(duì)照技術(shù)文檔制作與審核合同3篇
- 2024年高端住宅銷售代理協(xié)議版
- 2025年度甜品連鎖店品牌授權(quán)合作合同范本3篇
- 2024幼兒園幼兒安全與健康管理聘用協(xié)議書(shū)3篇
- 2024幼兒園教師學(xué)生個(gè)性發(fā)展與教育引導(dǎo)合同3篇
- 2024年電子商務(wù)用戶隱私保護(hù)協(xié)議3篇
- 2024年電子產(chǎn)品物流配送合同
- 2025年度冷鏈倉(cāng)儲(chǔ)與配送服務(wù)合同范本3篇
- 2024物流運(yùn)輸合同涉及的責(zé)任與義務(wù)
- 蘇軾的人生經(jīng)歷英文版
- 全新大學(xué)英語(yǔ)語(yǔ)法手冊(cè)教案
- 2022年11月26日四川省瀘州市事業(yè)單位招聘考試《綜合知識(shí)》精選真題及答案
- 消化內(nèi)鏡治療新技術(shù)課件
- 小學(xué)語(yǔ)文作業(yè)分層設(shè)計(jì)分析
- 讀者文章匯總 讀者文摘100篇
- 現(xiàn)代文閱讀之散文
- 山東省濟(jì)南市高職單招2022-2023學(xué)年醫(yī)學(xué)綜合真題及答案
- 配色技術(shù)員工作計(jì)劃工作總結(jié)述職報(bào)告PPT模板下載
- 挖掘機(jī)、裝載機(jī)檢驗(yàn)報(bào)告完整
- 小學(xué)科學(xué)三年級(jí)上冊(cè)期末考試質(zhì)量分析
評(píng)論
0/150
提交評(píng)論