Hibernate工做原理及爲何要使用Hibernate?前端
工做原理:web
1.讀取並解析配置文件spring
2.讀取並解析映射信息,建立SessionFactory數據庫
3.打開Session編程
4.建立事務Transation設計模式
5.持久化操做瀏覽器
6.提交事務緩存
7.關閉Sessiontomcat
8.關閉SesstionFactory安全
爲何要使用Hibernate(即它的優勢):
1. 對JDBC訪問數據庫的代碼作了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。
2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工做
3. hibernate使用Java反射機制,而不是字節碼加強程序來實現透明性。
4.
hibernate映射的靈活性很出色。它支持各類關係數據庫,從一對一到多對多的各類複雜關係。
2, Hibernate中get和load方法的區別
hibernate對於load方法認爲該數據在數據庫中必定存在,能夠放心的使用代理來延遲加載,若是在使用過程當中發現了問題,只能拋異常;
hibernate對於get方法,hibernate必定要獲取到真實的數據,不然返回null。
具體介紹:
1. 對於get方法,hibernate會確認一下該id對應的數據是否存在,首先在session緩存中查找,而後在二級緩存中查找,尚未就查詢數據庫,數據庫中沒有就返回null。
2. load方法加載實體對象的時候,根據映射文件上類級別的lazy屬性的配置(默認爲true)。
分狀況討論:
(1)若爲true,則首先在Session緩存中查找,看看該id對應的對象是否存在,不存在則使用延遲加載,返回實體的代理類對象(該代理類爲實體類的子類,由CGLIB動態生成)。等到具體使用該對象(除獲取OID之外)的時候,再查詢二級緩存和數據庫,若仍沒發現符合條件的記錄,則會拋出一個ObjectNotFoundException。
(2)若爲false,就跟get方法查找順序同樣,只是最終若沒發現符合條件的記錄,則會拋出一個ObjectNotFoundException。
3,Hibernate是如何延遲加載?
Hibernate3 提供了屬性的延遲加載功能。當Hibernate在查詢數據的時候,數據並無存在於內存之中,而是當程序真正對數據的操做時,對象才存在於內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提升了服務器的性能。
4,Hibernate中怎樣實現類之間的關係?
類與類之間的關係主要體如今表與表之間的關係進行操做,它們都是對對象進行操做,咱們在程序中把全部的表與類都映射在一塊兒,它們經過配置文件中的many-to-one、one-to-many、many-to-many進行操做。
5,Hibernate中的update()和saveOrUpdate()的區別?
saveOrUpdate():
1,若是對象已經在本session中持久化了,不作任何事
2,若是另外一個與本session關聯的對象擁有相同的持久化標識(identifier),拋出一個異常
3,若是對象沒有持久化標識(identifier)屬性,對其調用save()
4,若是對象的持久標識(identifier)代表其是一個新實例化的對象,對其調用save()
5,若是對象是附帶版本信息的(經過或 )而且版本屬性的值代表其是一個新實例化的對象,調用save()。不然update() 這個對象。
update() :
是將一個遊離狀態的實體對象直接更新。
6,說說Hibernate的緩存機制。
1. 一級緩存:內部緩存存在Hibernate中,屬於應用事物級緩存。
2. 二級緩存:應用級緩存、 分佈式緩存。
使用場景:數據不會被第三方修改、數據大小在可接受範圍、數據更新頻率低、同一數據被系統頻繁使用、非關鍵數據
3.引入第三方緩存(如ehcache等)。
7,如何優化Hibernate?
1.使用雙向一對多關聯,不使用單向一對多
2.靈活使用單向一對多關聯
3.不用一對一,用多對一取代
4.配置對象緩存,不使用集合緩存
5.一對多集合使用Bag,多對多集合使用Set
6. 繼承類使用顯式多態
7. 表字段要少,表關聯不要怕多,有二級緩存撐腰
8,談談hibernate的延遲加載和openSessionInView
延遲加載要在session範圍內,用到的時候再加載;
opensessioninview是在web層寫了一個filter來打開和關閉session,這樣就表示在一次request過程當中session一直開着,保證了延遲加載在session中的這個前提。
9,簡要闡述struts2的工做流程
一、客戶端瀏覽器發出HTTP請求。
二、根據web.xml配置,該請求被FilterDispatcher接收。
三、根據struts.xml配置,找到須要調用的Action類和方法,並經過IoC方式,將值注入給Aciton。
四、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。
五、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。
六、返回HTTP響應到客戶端瀏覽器。
10,說下Struts的設計模式
MVC模式
1,web應用程序啓動時就會加載並初始化ActionServlet;
2,用戶提交表單時,一個配置好的ActionForm對象被建立,並被填入表單相應的數
據;
3,ActionServlet根據Struts-config.xml文件配置好的設置決定是否須要表單驗證,若是須要就調用ActionForm的Validate()驗證後選擇將請求發送到哪一個Action,若是Action不存在,ActionServlet會先建立這個對象,而後調用Action的execute()方法;
4,Execute()從ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對
象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件;
5,ActionForward對象指定的jsp生成動
態的網頁,返回給客戶。
11,Struts的優缺點
優勢:
1. 實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現.
2. 有豐富的tag能夠用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提升開發效率。另外,就目前國內的JSP開發者而言,除了使用JSP自帶的經常使用標記外,不多開發本身的標記,或許Struts是一個很好的起點。
3. 頁面導航.頁面導航將是從此的一個發展方向,事實上,這樣作,使系統的脈絡更加清晰。經過一個配置文件,便可把握整個系統各部分之間的聯繫,這對於後期的維護有着莫大的好處。尤爲是當另外一批開發者接手這個項目時,這種優點體現得更加明顯。
4. 提供Exception處理機制 .
5. 數據庫連接池管理
6. 支持I18N
缺點:
1.
轉到展現層時,須要配置forward,每一次轉到展現層,相信大多數都是直接轉到jsp,而涉及到轉向,
須要配置forward,若是有十個展現層的jsp,須要配置十次struts,並且還不包括有時候目錄、文件變動,須要從新修改forward,注意,每次修改配置以後,要求從新部署整個項目,而tomcate這樣的服務器,還必須從新啓動服務器,若是業務變動複雜頻繁的系統,這樣的操做簡單不可想象。如今就是這樣,幾十上百我的同時在線使用咱們的系統,你們能夠想象一下,個人煩惱有多大。
2. Struts 的Action必需是thread-safe方式,它僅僅容許一個實例去處理全部的請求。因此action用到的全部的資源都必需統一同步,這個就引發了線程安全的問題。
3. 測試不方便. Struts的每一個Action都同Web層耦合在一塊兒,這樣它的測試依賴於Web容器,單元測試也很難實現。不過有一個Junit的擴展工具Struts TestCase能夠實現它的單元測試。
4.
類型的轉換.
Struts的FormBean把全部的數據都做爲String類型,它可使用工具Commons-Beanutils進行類型轉化。但它的轉化都是在Class級別,並且轉化的類型是不可配置的。類型轉化時的錯誤信息返回給用戶也是很是困難的。
5. 對Servlet的依賴性過強. Struts處理Action時必須要依賴ServletRequest 和ServletResponse,全部它擺脫不了Servlet容器。
6. 前端表達式語言方面.Struts集成了JSTL,因此它主要使用JSTL的表達式語言來獲取數據。但是JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱。
7. 對Action執行的控制困難. Struts建立一個Action,若是想控制它的執行順序將會很是困難。甚至你要從新去寫Servlet來實現你的這個功能需求。
8. 對Action 執行前和後的處理. Struts處理Action的時候是基於class的hierarchies,很難在action處理前和後進行操做。
9. 對事件支持不夠.
在struts中,實際是一個表單Form對應一個Action類(或DispatchAction),換一句話說:在Struts中實際是一個表單只能
對應一個事件,struts這種事件方式稱爲applicationevent,application event和component
event相比是一種粗粒度的事件。
12,爲何要使用spring(即優勢)?
1. Spring能有效地組織你的中間層對象,無論你是否選擇使用了EJB。若是你僅僅使用了Struts或其餘爲J2EE的 API特製的framework,Spring致力於解決剩下的問題。
2. Spring能消除在許多工程中常見的對Singleton的過多使用。過多使用Singleton下降了系統的可測試性和麪向對象的程度。
3.
經過一種在不一樣應用程序和項目間一致的方法來處理配置文件,Spring能消除各類各樣自定義格式的屬性文件的須要。曾經對某個類要尋找的是哪一個魔法般的
屬性項或系統屬性感到不解,爲此不得不去讀Javadoc甚至源編碼?有了Spring,你僅僅須要看看類的JavaBean屬性。Inversion
ofControl的使用(在下面討論)幫助完成了這種簡化。
4.經過把對接口編程而不是對類編程的代價幾乎減小到沒有,Spring可以促進養成好的編程習慣。
5. Spring被設計爲讓使用它建立的應用盡量少的依賴於他的APIs。在Spring應用中的大多數業務對象沒有依賴於Spring。
6. 使用Spring構建的應用程序易於單元測試。
7.Spring能使EJB的使用成爲一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或local EJBs來實現業務接口,卻不會影響調用代碼。
8. Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適用於許多web應用。例如,Spring能使用AOP提供聲明性事務管理而不經過EJB容器,若是你僅僅須要與單個數據庫打交道,甚至不須要一個JTA實現。
9. Spring爲數據存取提供了一個一致的框架,不管是使用的是JDBC仍是O/R mapping產品(如Hibernate)。
13,列舉一下你知道的實現spring事務的幾種方式
(1),編程式事務管理:須要手動編寫代碼,在實際開發中不多使用,
(2),基於TransactionProxyFactoryBean的聲明式事務管理,須要爲每一個進行事務管理的類作相應配置
(3),基於AspectJ的XML的聲明式事務管理,不須要改動類,在XML文件中配置好便可
(4),基於註解的聲明式事務管理,配置簡單,須要在業務層類中添加註解
14,談談spring事務的隔離級別和傳播行爲
隔離級別:
- DEFAULT使用數據庫默認的隔離級別
- READ_UNCOMMITTED會出現髒讀,不可重複讀和幻影讀問題
- READ_COMMITTED會出現重複讀和幻影讀
- REPEATABLE_READ會出現幻影讀
- SERIALIZABLE最安全,可是代價最大,性能影響極其嚴重
和傳播行:
- REQUIRED存在事務就融入該事務,不存在就建立事務
- SUPPORTS存在事務就融入事務,不存在則不建立事務
- MANDATORY存在事務則融入該事務,不存在,拋異常
- REQUIRES_NEW老是建立新事務
- NOT_SUPPORTED存在事務則掛起,一直執行非事務操做
- NEVER老是執行非事務,若是當前存在事務則拋異常
- NESTED嵌入式事務
15,什麼是DI機制?
依賴注入(Dependecy Injection)和控制反轉(Inversion of Control)是同一個概念,具體的講:當某個角色須要另一個角色協助的時候,在傳統的程序設計過程當中,一般由調用者來建立被調用者的實例。
但在spring中 建立被調用者的工做再也不由調用者來完成,所以稱爲控制反轉。建立被調用者的工做由spring來完成,而後注入調用者
所以也稱爲依賴注入。
spring以動態靈活的方式來管理對象 , 注入的兩種方式,設置注入和構造注入。
設置注入的優勢:直觀,天然
構造注入的優勢:能夠在構造器中決定依賴關係的順序。
16,什麼是AOP?
面向切面編程(AOP)完善spring的依賴注入(DI),
面向切面編程在spring中主要表現爲兩個方面 :
1.面向切面編程提供聲明式事務管理
2.spring支持用戶自定義的切面
做者:阿木俠連接:http://www.jianshu.com/p/513b760fee0b來源:簡書著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。