Hibernate面試題
1.講下什麽是Hibernate?
中文翻譯過來是冬眠的意思,hibernate是一個開源的對象關系映射框架,它對JDBC進行了封裝,實現了java實體類與數據庫的表建立了映射關系。達到數據持久化的目的。
2.講下什麽是ORM?ORM組件有哪些?
orm是對象關系映射,是一種程序技術,通過將java對象映射到數據庫表,通過操作java對象,就可以完成對數據表的操作。常用的orm組件有JDBC、Hibernate、mybatis、springDate等
3.Hibernate和JDBC相比的優點是什麽?缺點是什麽?
優點:簡化了Dao層訪問數據庫的重復性代碼
hibernate是一個全自動的orm框架,它可以自動生成sql語句,自動執行。
hibernate的映射靈活,(數據庫方言)支持很多關系型數據庫,從一對一到多對多的各種復雜關系
hibernate提供了緩存機制(session緩存,二級緩存,查詢緩存),提高了性能。
缺點:hibernate是個重量級框架,對jdbc的封裝過於厲害,失去了對sql的控制,無法對sql進行優化。在面對批量操作的時候,hibernate的性能就遠遠低於jdbc。
4.如何搭建一個Hibernate的環境
1.先導入jar包與配置文件、hibernate啟動session的工具類。
2.在配置文件中配置數據庫的基本信息與數據庫方言
3.進行測試,先創建實體類和數據庫中的表。創建映射文件,
命名規則是 實體類名.hbm.xml。位置要與實體類同一包下。
在映射文件中配置 實體類與數據庫表之間的映射關系。
在hibernate.cfg.xml配置文件中添加映射文件的路徑。
4.通過hibernate的工具類創建sessionfactory,通過工廠創建session對象,通過session開啟事務,進行數據操作後,事務提交。
5.說說hibernate的三種狀態之間如何轉換?
hibernate的三種狀態是瞬時狀態、持久狀態、托管狀態
瞬時狀態:session緩存中沒有對象,數據庫中也沒有對應記錄
持久狀態:session緩存中有對象,數據庫中有對應記錄
托管狀態:session緩存中沒有對象,數據庫中有對應記錄
比如有一個User實體類和一張User表。當new了一個user對象,但沒有開啟事務。此時user就處於瞬時狀態,與數據庫的數據沒有任何聯系,當開啟事務後,執行了session.save()方法後,session緩存中存放了該user對象,而數據庫中也有相應的這條數據,此時就轉換為持久狀態。當事務提交後,session被銷毀。session緩存中就沒有user對象,而數據庫表中有相應記錄,此時為托管狀態。
6.Hibernate中session有幾種創建方式?都有那些區別?
有兩種創建方式:
第一種是:通過sessionfactory.getcurrentSession()創建session,它是從當前線程中去找,看有沒有session,如果有則返回session,如果沒有則創建session。屬於單例模式
第二種是:通過sessionfactory.opensession()創建session,每次都是新創建一個session。
7.Hibernate中有哪些緩存?都是如何配置的?(三個緩存都要說)
hibernate中有一級緩存(session緩存),二級緩存(sessionfactory緩存)、查詢緩存(三級緩存)
1級緩存:創建session,每次獲取數據,hibernate會優先從session中找,如果沒有,再去查詢。查詢後放到緩存中,當session關閉,一級緩存銷毀。session緩存中的數據不能被別的session共享
2級緩存:sessionfactory級別緩存,sessionfactory中的session共享一個二級緩存。
sessionfactory緩存分為兩部分:內置緩存和外置緩存,內置緩存是hibernate自己使用,外界只能讀取。而外置緩存是提供個用戶使用,hibernate只提供了外置緩存的接口,需要第三方提供商實現。常用的有ehcache等。
二級緩存的使用:1.先導入ehcache的jar包和ehcache的配置文件(二級緩存的默認屬性)
2.在hibernate.cfg.xml中開啟二級緩存(默認是關閉)
3.確定二級緩存提供商
4.配置緩存對象(有兩種模式,一種只讀,一種讀寫)
3級緩存(查詢緩存):由於session.creatquery()在二級緩存中不起作用,便提供了三級緩存
三級緩存的配置:1.開啟二級緩存,確定提供商,確定緩存對象
2.查詢後,調用setcacheable(true)放到緩存中
3.讀取時,調用setcacheable(true)去緩存中取
8.說說get&load的區別
get:調用後立即發送sql去查詢,如果查詢一個不存在的值返回null。
load:懶加載機制,調用後返回一個代理對象,只有id有值。當使用到非id以外的屬性時才會發sql語句去查詢。如果查詢一個不存在的值會拋出異常
9.如何在控制臺看到hibernate生成並執行的sql?
在hibernate.cfg.xml中配置show_sql屬性為true
10.Hibernate中有幾種檢索方式?
hibernate有兩種檢索方式:
1.立即檢索:立即查詢,在執行查詢語句時,立即查詢所有的數據。get
2.延遲檢索:延遲查詢,在執行查詢語句之後,在需要時再查詢。
11.說說save(),flush(),commit()方法調用後都做了什麽?
save():編寫好sql語句並存到緩存區中
flush():把緩存區中的sql刷到數據庫中,更新數據。
commit():提交事務,並隱式調用flush(),更新數據
12.Hibernate中怎樣實現類之間的關系?(如:一對多、多對多的關系)
1對多:
1.實體類中:1的一方用set集合保存多的一方 ,多的一方用對象來保存1的一方
2.在1的一方的映射文件中配置set標簽,set標簽中name屬性=“存放多的一方的屬性”,key標簽中的column屬性為外鍵字段。onetomany標簽的class屬性為多的一方的全類名。
3.在多的一方的映射文件中配置manytoone標簽,標簽中的name屬性為保存一的一方的屬性名。配置column標簽 標簽中的屬性name為外鍵
多對多:
1.在實體類中都用set集合保存對方
2.在映射文件中配置set標簽 標簽中name為存放另一方的屬性名,標簽中table屬性為中間表名
配置key標簽 key標簽中column屬性為當前表的屬性
再配置manytomany標簽。標簽中column屬性為另一方的外鍵 class屬性為另一方的實體類全類名
13.Hibernate是如何延遲加載?
通過lazy屬性來控制懶加載機制,在映射文件中set標簽中配置lazy屬性,一般默認為true
lazy屬性中有三個值,true為懶加載 false為不加載。extra為及其懶惰(當用戶只需要訂單數時發送聚合函數去查詢)
14.談談Hibernate中inverse的作用?
inverse常用於一對多,多對多的映射文件中的set標簽,inverse屬性設置為true,是講維護外鍵權反轉到另一方,在一對多中,默認為1的一方,在多對多中,雙方都維護,不設置權限反轉會拋異常
15.MySQL默認的事務隔離級別是多少?jdbc如何修改?Hibernate如何修改?
mysql默認的事務隔離級別為4,在jdbc中通過connection這個類中的一個常量值來設置。
hibernate中通過在配置文件hibernate.cfg.xml中配置事務隔離級別,一般默認為4
16.事務的特性有哪些?
事務特性有原子性、隔離性、持久性、一致性
17.什麽是臟讀,不可重復讀,幻讀
臟讀:就是讀到另一個事務沒有提交的數據
不可重復讀:一個事務多次讀取數據期間另一個事務進行修改,多次讀取到的數據不同。
18.說說連接池的原理
連接池:連接池就是提前創建好connection放在一個池中,狀態都為空閑狀態,當外界需要用到connection時,分配connection給予使用,該connection狀態為使用狀態。連接池有自己的管理機制,但從conncetion不夠時,它會闖創建,但多於規定數時,進行銷毀。工作完成的connetion會被回收,狀態變更為空閑狀態
19.說說HQL和QBC,項目中都是怎麽用的?
HQL與qbc都是面向對象的查詢語句,qbc相對於hql更加面向對象,在qbc中把查詢語句都封裝成了方法。
qbc:通過調用不同的方法來實現對對象的操作,從而對數據進行操作
hql:可以手動編寫sql語句來進行查詢。
20.說說悲觀鎖和樂觀鎖?
悲觀鎖:默認在使用數據時一定發生別人修改我使用的數據,所以對使用數據進行上鎖,數據庫提供實現(通過for update來上鎖)
樂觀鎖:默認在使用數據時沒有發生別人修改我使用的數據。通過版本號來實現。在實體類中加入version屬性,表中添加version字段,每次事務提交之前都核對版本號,如果版本號不匹配,這事務提交失敗,重新獲取數據,每次事務提交後,版本號自增
21.說說Struts2的來歷
Struts2是由Struts1的名氣加webwork的實幹組成的,由於前期的struts1不滿足需求,webwork知名度低,兩者結合,形成了Struts2
22.說說struts2的工作流程
struts2工作流程:瀏覽器發送請求,請求通過一系列的過濾器到到達struts2核心控件filterdispatcher,filterdispatcher調用actionmapper來確定請求是否需要調用某個action,如果需要,filterdispatcher就把請求交給action代理對象,action的代理對象通過configuration Manager查詢struts配置文件,找到需要調用的action類,action代理對象會創建一個actioninvcation實例來調用action,在調用action過程中會通過struts自帶的18個攔截器,在action調用完後,會產生一個結果,如果這個結果是一個jsp的話,就會調用視圖模板來產生一個jsp.然後在響應給瀏覽器。
23.如何搭建一個Struts2的項目
搭建struts2項目流程:1.先導入struts2的jar包和配置文件
2.在web。xml中添加struts2的核心控件
3.創建一個helloaction,在struts的配置文件中配置helloaction。
4.訪問action進行測試
24.什麽是值棧?項目中怎麽用的?
值棧:就是一個存放數據的內存區域,可以看做request來使用。在struts2中指的就是valuestack,valuestack是actioncontext的一個對象,是棧結構。存放action對象。
在項目中,在action中聲明與參數同名的熟悉,並提供get/set方法。當struts調用action的時候就會為action相應的屬性賦值。而這個action對象就會存放到
值棧中,我們只需調用即可。
25.說說Struts2有幾種校驗方式
struts2有3中校驗方式
第一種:action繼承actionsupport,重寫父類的validate方法(該方法對action中所有方法都進行校驗)
第二種:重寫validate方法名()方法 ,該方法只會校驗validate後面跟著的方法名的方法(註意方法名首字母要大寫)
第三種:框架校驗,編寫配置文件,命名規則是action類名-validation.xml,位置與要校驗的action放在同一包下。
26.Struts2的攔截器怎麽定義的?項目中怎麽用的?
struts2的攔截器類似與過濾器,但只對action起作用。
在項目中,先創建一個攔截器類繼承abstractintercepted類,重寫intercept應特set()方法。
在struts。xml配置文件中,定義一個攔截器,用interceptor標簽,標簽中的name屬性為攔截器名,class屬性為攔截器類的全類名。在定義一個攔截器棧,通過interceptor-stack標簽,在該標簽中引入自定義的攔截器和默認的攔截器棧defalutestack。最後引用自定義的攔截器棧。
27.說下token的底層實現原理?
struts中的token是用來解決表單重復提交的問題,底層原理是,在瀏覽器請求訪問一個帶有token屬性的頁面的時候,服務器會生成一個隨機數,這個隨機數會保存一份在session中,也會發送一份到頁面中,當用戶提交表單的時候,服務器會去session中查找是否有與之相等的隨機,如果有,則放行。服務器清除該隨機數。當表單重復提交時,服務器在session中找不到與之匹配的隨機數,則進行攔截。
28.說說OGNL表達式?struts2中怎麽用的?
ognl:即對象導航圖語言,可以用來代替頁面中的java腳本,簡化對數據的訪問操作。ognl表達式:與el表達式類似
struts2中:ognl配合這struts表簽來使用,存在值棧中的數據可以直接取,而存在非值棧中的數據就要
用#來獲取,用%{}包裹的ognl表達式瀏覽器會以ognl表達式來解析。
29.action中如何訪問ServletAPI有幾種方式?
有三種方式:
第一種:通過actioncontent訪問
第二種:通過servletactioncontent來訪問
第三種:通過實現servlet*Aware接口來訪問
30.說說Struts2和Hibernate整合流程
struts2與hibernate整合流程:
1.先搭建strut2環境:
1.導入struts2jar包和配置文件
2.在web.xml中配置struts2核心控件
3.編寫一個hello action,並在struts2的配置文件中配置該action
4.測試環境是否搭建成功
2.搭建hibernate環境
1.導入hibernatejar包和配置文件
2.導入hibernate工具類
3.創建實體類和數據庫建表
4.編寫映射文件,命名規則:實體類名.hbm.xml,位置:與實體類在同一包下。在映射文件中配置實體類與數據庫表的映射關系
5.編寫測試類進行環境測試
Hibernate面試題