Hibernate工作原理及為什么要使用Hibernate?
(更多相關(guān)面試題推薦:java面試題及答案)
工作原理:
????1.讀取并解析配置文件
????2.讀取并解析映射信息,創(chuàng)建SessionFactory
????3.打開Session
????4.創(chuàng)建事務(wù)Transation
????5.持久化操作
????6.提交事務(wù)
????7.關(guān)閉Session
????8.關(guān)閉SesstionFactory
為什么要使用Hibernate(即它的優(yōu)點(diǎn)):
????1. 對(duì)JDBC訪問數(shù)據(jù)庫(kù)的代碼做了封裝,大大簡(jiǎn)化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼。
????2. Hibernate是一個(gè)基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的ORM實(shí)現(xiàn)。他很大程度的簡(jiǎn)化DAO層的編碼工作
????3. hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來實(shí)現(xiàn)透明性。
????4. hibernate映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。
2,? Hibernate中g(shù)et和load方法的區(qū)別
????????hibernate對(duì)于load方法認(rèn)為該數(shù)據(jù)在數(shù)據(jù)庫(kù)中一定存在,可以放心的使用代理來延遲加載,如果在使用過程中發(fā)現(xiàn)了問題,只能拋異常;
????????hibernate對(duì)于get方法,hibernate一定要獲取到真實(shí)的數(shù)據(jù),否則返回null。
具體介紹:
????????1. 對(duì)于get方法,hibernate會(huì)確認(rèn)一下該id對(duì)應(yīng)的數(shù)據(jù)是否存在,首先在session緩存中查找,然后在二級(jí)緩存中查找,還沒有就查詢數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)中沒有就返回null。
????????2.? load方法加載實(shí)體對(duì)象的時(shí)候,根據(jù)映射文件上類級(jí)別的lazy屬性的配置(默認(rèn)為true)。
分情況討論:
????????(1)若為true,則首先在Session緩存中查找,看看該id對(duì)應(yīng)的對(duì)象是否存在,不存在則使用延遲加載,返回實(shí)體的代理類對(duì)象(該代理類為實(shí)體類的子類,由CGLIB動(dòng)態(tài)生成)。等到具體使用該對(duì)象(除獲取OID以外)的時(shí)候,再查詢二級(jí)緩存和數(shù)據(jù)庫(kù),若仍沒發(fā)現(xiàn)符合條件的記錄,則會(huì)拋出一個(gè)ObjectNotFoundException。
????????(2)若為false,就跟get方法查找順序一樣,只是最終若沒發(fā)現(xiàn)符合條件的記錄,則會(huì)拋出一個(gè)ObjectNotFoundException。
3,Hibernate是如何延遲加載?
?????? Hibernate3 提供了屬性的延遲加載功能。當(dāng)Hibernate在查詢數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒有存在于內(nèi)存之中,而是當(dāng)程序真正對(duì)數(shù)據(jù)的操作時(shí),對(duì)象才存在于內(nèi)存中,就實(shí)現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開銷,從而提高了服務(wù)器的性能。
4,Hibernate中怎樣實(shí)現(xiàn)類之間的關(guān)系?
????????類與類之間的關(guān)系主要體現(xiàn)在表與表之間的關(guān)系進(jìn)行操作,它們都是對(duì)對(duì)象進(jìn)行操作,我們?cè)诔绦蛑邪阉械谋砼c類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many進(jìn)行操作。
5,Hibernate中的update()和saveOrUpdate()的區(qū)別?
saveOrUpdate():
????1,如果對(duì)象已經(jīng)在本session中持久化了,不做任何事
??? 2,如果另一個(gè)與本session關(guān)聯(lián)的對(duì)象擁有相同的持久化標(biāo)識(shí)(identifier),拋出一個(gè)異常
????3,如果對(duì)象沒有持久化標(biāo)識(shí)(identifier)屬性,對(duì)其調(diào)用save()
????4,如果對(duì)象的持久標(biāo)識(shí)(identifier)表明其是一個(gè)新實(shí)例化的對(duì)象,對(duì)其調(diào)用save()
????5,如果對(duì)象是附帶版本信息的(通過
update() :
是將一個(gè)游離狀態(tài)的實(shí)體對(duì)象直接更新。
6,說說Hibernate的緩存機(jī)制。
1. 一級(jí)緩存:內(nèi)部緩存存在Hibernate中,屬于應(yīng)用事物級(jí)緩存。
2. 二級(jí)緩存:應(yīng)用級(jí)緩存、 分布式緩存。
使用場(chǎng)景:數(shù)據(jù)不會(huì)被第三方修改、數(shù)據(jù)大小在可接受范圍、數(shù)據(jù)更新頻率低、同一數(shù)據(jù)被系統(tǒng)頻繁使用、非關(guān)鍵數(shù)據(jù)
3.引入第三方緩存(如ehcache等)。
7,如何優(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ì)多集合使用Set
6. 繼承類使用顯式多態(tài)
7. 表字段要少,表關(guān)聯(lián)不要怕多,有二級(jí)緩存撐腰
8,談?wù)刪ibernate的延遲加載和openSessionInView
????????延遲加載要在session范圍內(nèi),用到的時(shí)候再加載;
????????opensessioninview是在web層寫了一個(gè)filter來打開和關(guān)閉session,這樣就表示在一次request過程中session一直開著,保證了延遲加載在session中的這個(gè)前提。
(視頻推薦:java課程)
9,簡(jiǎn)要闡述struts2的工作流程
1、客戶端瀏覽器發(fā)出HTTP請(qǐng)求。
2、根據(jù)web.xml配置,該請(qǐng)求被FilterDispatcher接收。
3、根據(jù)struts.xml配置,找到需要調(diào)用的Action類和方法,并通過IoC方式,將值注入給Aciton。
4、Action調(diào)用業(yè)務(wù)邏輯組件處理業(yè)務(wù)邏輯,這一步包含表單驗(yàn)證。
5、Action執(zhí)行完畢,根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果result,并跳轉(zhuǎn)到相應(yīng)頁(yè)面。
6、返回HTTP響應(yīng)到客戶端瀏覽器。
10,說下Struts的設(shè)計(jì)模式
MVC模式
? 1,web應(yīng)用程序啟動(dòng)時(shí)就會(huì)加載并初始化ActionServlet;
? 2,用戶提交表單時(shí),一個(gè)配置好的ActionForm對(duì)象被創(chuàng)建,并被填入表單相應(yīng)的數(shù) 據(jù);
? 3,ActionServlet根據(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()方法;
? 4,Execute()從ActionForm對(duì)象中獲取數(shù)據(jù),完成業(yè)務(wù)邏輯,返回一個(gè)ActionForward對(duì) 象,ActionServlet再把客戶請(qǐng)求轉(zhuǎn)發(fā)給ActionForward對(duì)象指定的jsp組件;
? 5,ActionForward對(duì)象指定的jsp生成動(dòng) 態(tài)的網(wǎng)頁(yè),返回給客戶。
11,Struts的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
????1. 實(shí)現(xiàn)MVC模式,結(jié)構(gòu)清晰,使開發(fā)者只關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn).
????2. 有豐富的tag可以用 ,Struts的標(biāo)記庫(kù)(Taglib),如能靈活動(dòng)用,則能大大提高開發(fā)效率。另外,就目前國(guó)內(nèi)的JSP開發(fā)者而言,除了使用JSP自帶的常用標(biāo)記外,很少開發(fā)自己的標(biāo)記,或許Struts是一個(gè)很好的起點(diǎn)。
????3. 頁(yè)面導(dǎo)航.頁(yè)面導(dǎo)航將是今后的一個(gè)發(fā)展方向,事實(shí)上,這樣做,使系統(tǒng)的脈絡(luò)更加清晰。通過一個(gè)配置文件,即可把握整個(gè)系統(tǒng)各部分之間的聯(lián)系,這對(duì)于后期的維護(hù)有著莫大的好處。尤其是當(dāng)另一批開發(fā)者接手這個(gè)項(xiàng)目時(shí),這種優(yōu)勢(shì)體現(xiàn)得更加明顯。
????4. 提供Exception處理機(jī)制 .
????5. 數(shù)據(jù)庫(kù)鏈接池管理
????6. 支持I18N
缺點(diǎn):
????1. 轉(zhuǎn)到展示層時(shí),需要配置forward,每一次轉(zhuǎn)到展示層,相信大多數(shù)都是直接轉(zhuǎn)到j(luò)sp,而涉及到轉(zhuǎn)向, 需要配置forward,如果有十個(gè)展示層的jsp,需要配置十次struts,而且還不包括有時(shí)候目錄、文件變更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整個(gè)項(xiàng)目,而tomcate這樣的服務(wù)器,還必須重新啟動(dòng)服務(wù)器,如果業(yè)務(wù)變更復(fù)雜頻繁的系統(tǒng),這樣的操作簡(jiǎn)單不可想象?,F(xiàn)在就是這樣,幾十上百個(gè)人同時(shí)在線使用我們的系統(tǒng),大家可以想象一下,我的煩惱有多大。
????2. Struts 的Action必需是thread-safe方式,它僅僅允許一個(gè)實(shí)例去處理所有的請(qǐng)求。所以action用到的所有的資源都必需統(tǒng)一同步,這個(gè)就引起了線程安全的問題。
????3. 測(cè)試不方便. Struts的每個(gè)Action都同Web層耦合在一起,這樣它的測(cè)試依賴于Web容器,單元測(cè)試也很難實(shí)現(xiàn)。不過有一個(gè)Junit的擴(kuò)展工具Struts TestCase可以實(shí)現(xiàn)它的單元測(cè)試。
????4. 類型的轉(zhuǎn)換. Struts的FormBean把所有的數(shù)據(jù)都作為String類型,它可以使用工具Commons-Beanutils進(jìn)行類型轉(zhuǎn)化。但它的轉(zhuǎn)化都是在Class級(jí)別,而且轉(zhuǎn)化的類型是不可配置的。類型轉(zhuǎn)化時(shí)的錯(cuò)誤信息返回給用戶也是非常困難的。
????5. 對(duì)Servlet的依賴性過強(qiáng). Struts處理Action時(shí)必需要依賴ServletRequest 和ServletResponse,所有它擺脫不了Servlet容器。
????6. 前端表達(dá)式語(yǔ)言方面.Struts集成了JSTL,所以它主要使用JSTL的表達(dá)式語(yǔ)言來獲取數(shù)據(jù)??墒荍STL的表達(dá)式語(yǔ)言在Collection和索引屬性方面處理顯得很弱。
????7. 對(duì)Action執(zhí)行的控制困難. Struts創(chuàng)建一個(gè)Action,如果想控制它的執(zhí)行順序?qū)?huì)非常困難。甚至你要重新去寫Servlet來實(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),換一句話說:在Struts中實(shí)際是一個(gè)表單只能 對(duì)應(yīng)一個(gè)事件,struts這種事件方式稱為applicationevent,application event和component event相比是一種粗粒度的事件。
12,為什么要使用spring(即優(yōu)點(diǎn))?
????1. Spring能有效地組織你的中間層對(duì)象,不管你是否選擇使用了EJB。如果你僅僅使用了Struts或其他為J2EE的 API特制的framework,Spring致力于解決剩下的問題。
????2. Spring能消除在許多工程中常見的對(duì)Singleton的過多使用。過多使用Singleton降低了系統(tǒng)的可測(cè)試性和面向?qū)ο蟮某潭取?/p>
????3. 通過一種在不同應(yīng)用程序和項(xiàng)目間一致的方法來處理配置文件,Spring能消除各種各樣自定義格式的屬性文件的需要。曾經(jīng)對(duì)某個(gè)類要尋找的是哪個(gè)魔法般的 屬性項(xiàng)或系統(tǒng)屬性感到不解,為此不得不去讀Javadoc甚至源編碼?有了Spring,你僅僅需要看看類的JavaBean屬性。Inversion ofControl的使用(在下面討論)幫助完成了這種簡(jiǎn)化。
????4.通過把對(duì)接口編程而不是對(duì)類編程的代價(jià)幾乎減少到?jīng)]有,Spring能夠促進(jìn)養(yǎng)成好的編程習(xí)慣。
????5. Spring被設(shè)計(jì)為讓使用它創(chuàng)建的應(yīng)用盡可能少的依賴于他的APIs。在Spring應(yīng)用中的大多數(shù)業(yè)務(wù)對(duì)象沒有依賴于Spring。
????6. 使用Spring構(gòu)建的應(yīng)用程序易于單元測(cè)試。
????7.Spring能使EJB的使用成為一個(gè)實(shí)現(xiàn)選擇,而不是應(yīng)用架構(gòu)的必然選擇。你能選擇用POJOs或local EJBs來實(shí)現(xiàn)業(yè)務(wù)接口,卻不會(huì)影響調(diào)用代碼。
????8. Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適用于許多web應(yīng)用。例如,Spring能使用AOP提供聲明性事務(wù)管理而不通過EJB容器,如果你僅僅需要與單個(gè)數(shù)據(jù)庫(kù)打交道,甚至不需要一個(gè)JTA實(shí)現(xiàn)。
????9. Spring為數(shù)據(jù)存取提供了一個(gè)一致的框架,不論是使用的是JDBC還是O/R mapping產(chǎn)品(如Hibernate)。
13,列舉一下你知道的實(shí)現(xiàn)spring事務(wù)的幾種方式
????(1),編程式事務(wù)管理:需要手動(dòng)編寫代碼,在實(shí)際開發(fā)中很少使用,
????(2),基于TransactionProxyFactoryBean的聲明式事務(wù)管理,需要為每個(gè)進(jìn)行事務(wù)管理的類做相應(yīng)配置
????(3),基于AspectJ的XML的聲明式事務(wù)管理,不需要改動(dòng)類,在XML文件中配置好即可
????(4),基于注解的聲明式事務(wù)管理,配置簡(jiǎn)單,需要在業(yè)務(wù)層類中添加注解
14,談?wù)剆pring事務(wù)的隔離級(jí)別和傳播行為
隔離級(jí)別:
????- DEFAULT使用數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別
????- READ_UNCOMMITTED會(huì)出現(xiàn)臟讀,不可重復(fù)讀和幻影讀問題
????- READ_COMMITTED會(huì)出現(xiàn)重復(fù)讀和幻影讀
????- REPEATABLE_READ會(huì)出現(xiàn)幻影讀
????- SERIALIZABLE最安全,但是代價(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ù)則拋異常
????- NESTED嵌入式事務(wù)
15,什么是DI機(jī)制??
????????依賴注入(Dependecy Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個(gè)概念,具體的講:當(dāng)某個(gè)角色需要另外一個(gè)角色協(xié)助的時(shí)候,在傳統(tǒng)的程序設(shè)計(jì)過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實(shí)例。
????????但在spring中 創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成,因此稱為控制反轉(zhuǎn)。創(chuàng)建被調(diào)用者的工作由spring來完成,然后注入調(diào)用者?
因此也稱為依賴注入。
????????spring以動(dòng)態(tài)靈活的方式來管理對(duì)象 , 注入的兩種方式,設(shè)置注入和構(gòu)造注入。?
????????設(shè)置注入的優(yōu)點(diǎn):直觀,自然?
????????構(gòu)造注入的優(yōu)點(diǎn):可以在構(gòu)造器中決定依賴關(guān)系的順序。
16,什么是AOP??
面向切面編程(AOP)完善spring的依賴注入(DI),
面向切面編程在spring中主要表現(xiàn)為兩個(gè)方面 :
1.面向切面編程提供聲明式事務(wù)管理?
2.spring支持用戶自定義的切面
推薦教程:java入門
以上就是2023最新SSH框架面試題匯總的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://www.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)