Hibernate面試題匯總.doc_第1頁
Hibernate面試題匯總.doc_第2頁
Hibernate面試題匯總.doc_第3頁
Hibernate面試題匯總.doc_第4頁
Hibernate面試題匯總.doc_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

hibernate是什么?hibernate是基于ORM對象關(guān)系映射(完成對象數(shù)據(jù)到關(guān)系數(shù)據(jù)映射的機制)實現(xiàn)的,做數(shù)據(jù)持久化的工具HttpSession與Hibernate中Session的區(qū)別1. javax.servlet.http.HttpSession是一個抽象接口用途:存放這個用戶的一些經(jīng)常被用到的信息,例如:用戶名,權(quán)限等2. 它是hibernate操作數(shù)據(jù)庫的一個句柄對象 手動或者通過業(yè)務(wù)層獲取0. Hibernate介紹Hibernate是一個開放源代碼的對象關(guān)系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。 Hibernate可以應(yīng)用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在應(yīng)用EJB的J2EE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任。1.Hibernate有哪幾種查詢數(shù)據(jù)的方式(1)導(dǎo)航對象圖查詢 (2)OID查詢 (3)HQL (4)QBC (5)本地SQL2.load()和get()的區(qū)別load加載方法:Users user = (Users)session.load(Users.class, userId); get加載方法:Users user = (Users)session.get(Users.class, userId);兩加載方法區(qū)別:區(qū)別1:如果數(shù)據(jù)庫中,沒有userId的對象。如果通過get方法加載,則返回的是一個null;如果通過load加載,則返回一個代理對象,如果后面代碼如果調(diào)用user對象的某個屬性(比如user.getPassword())會拋出異常:org.hibernate.ObjectNotFoundException;區(qū)別2:load支持延遲加載,get不支持延遲加載。也就是說:Users user = (Users)session.load(Users.class, userId); 這句代碼不會去執(zhí)行數(shù)據(jù)庫查詢,只有用到user時才會去執(zhí)行數(shù)據(jù)庫查詢。而:Users user = (Users)session.get(Users.class, userId); 則立即去執(zhí)行數(shù)據(jù)庫查詢。 所以Users user = (Users)session.load(Users.class, userId);不會執(zhí)行任何sql。注意:Users user = (Users)session.load(Users.class, userId); System.out.println(user.getId(); 上面這2句代碼,不會去執(zhí)行數(shù)據(jù)庫操作。因為load后會在hibernate的一級緩存里存放一個map對象,該map的key就是userId的值,但是當(dāng)你getId()時,它會去一級緩存里拿map的key值,而不去執(zhí)行數(shù)據(jù)庫查詢。所以不會報任何錯。不會執(zhí)行任何數(shù)據(jù)庫操作。2.1請解釋Session的load方法和get方法的不同;以及Query的list和iterator方法的不同load():現(xiàn)在session緩存中尋找,如果找到了返回該對象,如果沒找到,程序會新建一個對象,并且返回,存在session中,不會在數(shù)據(jù)庫中查找,在程序中如果沒有用到這個實體類,可以節(jié)省一次數(shù)據(jù)庫連接。如果在程序中用到了這個實體類,這個實體類就會在數(shù)據(jù)庫去查找,如果沒有查找到就會拋異常。(延時加載)get():在緩存在查找,如果找到該對象,返回該對象。如果沒找到,會到數(shù)據(jù)庫中查找,如果數(shù)據(jù)庫中有則返回該對象,如果沒找到這返回空。(立即加載)3. Hibernate工作原理及為什么要用?原理:1. 讀取并解析配置文件2. 讀取并解析映射信息,創(chuàng)建SessionFactory3. 打開Sesssion4. 創(chuàng)建事務(wù)Transation5. 持久化操作6. 提交事務(wù)7. 關(guān)閉Session8. 關(guān)閉SesstionFactory為什么要用:1. 對JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼。2. Hibernate是一個基于JDBC的主流持久化框架,是一個優(yōu)秀的ORM實現(xiàn)。他很大程度的簡化DAO層的編碼工作3. hibernate使用Java反射機制,而不是字節(jié)碼增強程序來實現(xiàn)透明性。4. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫,從一對一到多對多的各種復(fù)雜關(guān)系。4 Hibernate是如何延遲加載?1. Hibernate2延遲加載實現(xiàn):a)實體對象 b)集合(Collection)2. Hibernate3 提供了屬性的延遲加載功能當(dāng)Hibernate在查詢數(shù)據(jù)的時候,數(shù)據(jù)并沒有存在與內(nèi)存中,當(dāng)程序真正對數(shù)據(jù)的操作時,對象才存在與內(nèi)存中,就實現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開銷,從而提高了服務(wù)器的性能。5.0 Hibernate中怎樣實現(xiàn)類之間的關(guān)系?(如:一對多、多對多的關(guān)系)類與類之間的關(guān)系主要體現(xiàn)在表與表之間的關(guān)系進行操作,它們都市對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、5 說下Hibernate的緩存機制1. 內(nèi)部緩存存在Hibernate中又叫一級緩存,屬于應(yīng)用事物級緩存2. 二級緩存:a) 應(yīng)用及緩存b) 分布式緩存條件:數(shù)據(jù)不會被第三方修改、數(shù)據(jù)大小在可接受范圍、數(shù)據(jù)更新頻率低、同一數(shù)據(jù)被系統(tǒng)頻繁使用、非 關(guān)鍵數(shù)據(jù)c) 第三方緩存的實現(xiàn)6 Hibernate的查詢方式Sql、Criteria,object comptositionHql:1、 屬性查詢2、 參數(shù)查詢、命名參數(shù)查詢3、 關(guān)聯(lián)查詢4、 分頁查詢5、 統(tǒng)計函數(shù)7 如何優(yōu)化Hibernate?1. 使用雙向一對多關(guān)聯(lián),不使用單向一對多2. 靈活使用單向一對多關(guān)聯(lián)3. 不用一對一,用多對一取代4. 配置對象緩存,不使用集合緩存5. 一對多集合使用Bag,多對多集合使用Set6. 繼承類使用顯式多態(tài)7. 表字段要少,表關(guān)聯(lián)不要怕多,有二級緩存撐腰8. hibernate的三種狀態(tài)之間如何轉(zhuǎn)換當(dāng)對象由瞬變狀態(tài)(Transient)一save()時,就變成了持久化狀態(tài)。當(dāng)我們在Session里存儲對象的時候,實際是在Session的Map里存了一份,也就是它的緩存里放了一份,然后,又到數(shù)據(jù)庫里存了一份,在緩存里這一份叫持久對象(Persistent)。Session 一 Close()了,它的緩存也都關(guān)閉了,整個Session也就失效了,這個時候,這個對象變成了游離狀態(tài)(Detached),但數(shù)據(jù)庫中還是存在的。當(dāng)游離狀態(tài)(Detached)update()時,又變?yōu)榱顺志脿顟B(tài)(Persistent)。當(dāng)持久狀態(tài)(Persistent)delete()時,又變?yōu)榱怂矔r狀態(tài)(Transient),此時,數(shù)據(jù)庫中沒有與之對應(yīng)的記錄。8.請解釋說明Hibernate控制下的POJO會呈現(xiàn)三種狀態(tài),分別是transient、persistenet和detached,請解釋這三種狀態(tài)Transient:瞬變狀態(tài):數(shù)據(jù)庫中沒數(shù)據(jù)。跟session不相關(guān)。沒存過。Persistenet:游離態(tài):在數(shù)據(jù)庫中有記錄,但是在session中沒有。需要手工同步。Detached:持久態(tài):數(shù)據(jù)庫中有記錄,session中也有這記錄。自動更新9. update()和saveOrUpdate()的區(qū)別?update()和saveOrUpdate()是用來對跨Session的PO進行狀態(tài)管理的。update()方法操作的對象必須是持久化了的對象。也就是說,如果此對象在數(shù)據(jù)庫中不存在的話,就不能使用update()方法。saveOrUpdate()方法操作的對象既可以使持久化了的,也可以使沒有持久化的對象。如果是持久化了的對象調(diào)用saveOrUpdate()則會更新數(shù)據(jù)庫中的對象;如果是未持久化的對象使用此方法,則save到數(shù)據(jù)庫中10. hibernate中一對多配置文件返回的是什么?hibernate中一對多配置文件會相應(yīng)的映射為兩張表,并且它們之間的關(guān)系是一對多的。例如:一個student和classes表的關(guān)系 。一個學(xué)生只能是一個班的,一個班可以有多個學(xué)生。11. Hibernate與spring的聯(lián)系hibernate中的一些對象可以給Spring來管理,讓Spring容器來創(chuàng)建hibernate中一些對象實例化。例如:SessionFactory,HibernateTemplate等。Hibernate本來是對數(shù)據(jù)庫的一些操作,放在DAO層,而Spring給業(yè)務(wù)層的方法定義了事務(wù),業(yè)務(wù)層調(diào)用DAO層的方法,很好的將Hibernate的操作也加入到事務(wù)中來了。12. Hibernate自帶的分頁機制是什么?如果不使用Hibernate自帶的分頁,則采用什么方式分頁?1、hibernate自帶的分頁機制:獲得Session對象后,從Session中獲得Query對象。用Query.setFirstResult():設(shè)置要顯示的第一行數(shù)據(jù),Query.setMaxResults():設(shè)置要顯示的最后一行數(shù)據(jù)。2、不使用hibernate自帶的分頁,可采用sql語句分頁,如:5:為每頁顯示的記錄,2為當(dāng)前頁: select * top 5 from table where tabId not in (select tabId top (2-1)*5 from table);13.什么是Hibernate的并發(fā)機制?怎么去處理并發(fā)問題?Hibernate并發(fā)機制:a、Hibernate的Session對象是非線程安全的,對于單個請求,單個會話,單個的工作單元(即單個事務(wù),單個線程),它通常只使用一次,然后就丟棄。如果一個Session 實例允許共享的話,那些支持并發(fā)運行的,例如Http request,session beans將會導(dǎo)致出現(xiàn)資源爭用。如果在Http Session中有hibernate的Session的話,就可能會出現(xiàn)同步訪問Http Session。只要用戶足夠快的點擊瀏覽器的“刷新”,就會導(dǎo)致兩個并發(fā)運行的線程使用同一個Session。b、多個事務(wù)并發(fā)訪問同一塊資源,可能會引發(fā)第一類丟失更新,臟讀,幻讀,不可重復(fù)讀,第二類丟失更新一系列的問題。解決方案:設(shè)置事務(wù)隔離級別。Serializable:串行化。隔離級別最高Repeatable Read:可重復(fù)讀Read Committed:已提交數(shù)據(jù)讀Read Uncommitted:未提交數(shù)據(jù)讀。隔離級別最差設(shè)置鎖:樂觀鎖和悲觀鎖。樂觀鎖:使用版本號或時間戳來檢測更新丟失,在的映射中設(shè)置 optimistic-lock=”all”可以在沒有版本或者時間戳屬性映射的情況下實現(xiàn) 版本檢查,此時Hibernate將比較一行記錄的每個字段的狀態(tài) 行級悲觀鎖:Hibernate總是使用數(shù)據(jù)庫的鎖定機制,從不在內(nèi)存中鎖定對象!只要為JDBC連接指定一下隔 離級別,然后讓數(shù)據(jù)庫去搞定一切就夠了。類LockMode 定義了Hibernate所需的不同的鎖定級別:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;14. Hibernate與jdbc的聯(lián)系hibernate是jdbc的輕量級封裝,包括jdbc的與數(shù)據(jù)庫的連接(用perty的配置文件實現(xiàn)當(dāng)然本質(zhì)是封裝了jdbc的forname),和查詢,刪除等代碼,都用面向?qū)ο蟮乃枷胗么a聯(lián)系起來,hibernate通過hbm 配置文件把po類的字段和數(shù)據(jù)庫的字段關(guān)聯(lián)起來比如數(shù)據(jù)庫的id,在po類中就是pravite Long id; public Long getId() ;public setId(Long id);然后hql語句也是面向?qū)ο蟮?,它的查詢語句不是查詢數(shù)據(jù)庫而是查詢類的,這些實現(xiàn)的魔法就是xml文件,其實hibernate=封裝的jdbc+xml文件15. hibernate拒絕連接、服務(wù)器崩潰的原因?最少寫5個1. db沒有打開2. 網(wǎng)絡(luò)連接可能出了問題3. 連接配置錯了4. 驅(qū)動的driver,url是否都寫對了5. LIB下加入相應(yīng)驅(qū)動,數(shù)據(jù)連接代碼是否有誤6. 數(shù)據(jù)庫配置可能有問題7. 當(dāng)前聯(lián)接太多了,服務(wù)器都有訪問人數(shù)限制的8. 服務(wù)器的相應(yīng)端口沒有開,即它不提供相應(yīng)的服務(wù)9 hibernate有哪些緩存,分別怎么使用?10 你對hibernate的了解到了一個什么樣的程度?11 寫出一個sql語句體現(xiàn)hibernate中一對多的關(guān)系16.hibernate.cfg.xml文件的作用該配置文件主要用來描述數(shù)據(jù)庫連接的相關(guān)信息,以及該應(yīng)用中關(guān)心映射文件所在的位置,和一些其他的設(shè)置,該文件一般放在項目的根目錄下。17.hibernate中的繼承關(guān)系按照數(shù)據(jù)庫的表結(jié)構(gòu)來分的話有那幾種?1.所有類在一張表中,通過添加一個鑒別字段來區(qū)分子類。2.每個子類一張表,父類的字段被分配到每個表中。3.每個類一張表,包括父類和子類,通過父類和子類的ID來體現(xiàn)繼承關(guān)系18.hibernate中常見的關(guān)聯(lián)關(guān)系有那3種?那種事最常見的一對一一對多多對多一對多最常見19.hibernate中的cascade屬性的作用: 級聯(lián)操作20.hql中能否使用max(),sum(),sount()等組函數(shù)?能21.hql中能否使用Group by? 能22.hql中加select和不加select的區(qū)別不加select會根據(jù)用戶所提供的條件查詢數(shù)據(jù),并打成所映射的對象加了select則不會23.Hql中query.uniqueResult()和query.list()的區(qū)別?前者指返回一個對象,后者返回一個list集合24.簡述一下qbcqbc(query by criteria)這種ape封裝了sql語句的動態(tài)拼接,對查詢提供了更加面向?qū)ο蟮墓δ芙涌?5.請解釋為什么SessionFactory一般以單例方式使用SessionFactory是一個大型對象,而且線程安全。在一個程序中只需要一個26.請解釋說明hibernate配置文件中dialect屬性的確切含義數(shù)據(jù)庫方言:多種數(shù)據(jù)庫擁有不同的語言語法,通過設(shè)置dialect指定所用的數(shù)據(jù)庫,并生成對應(yīng)語法和語言的sql語句。27.請解釋Hibernate3.2主鍵的生成方式中,native和identity方式的區(qū)別。Native主鍵生成方式會根據(jù)不同的底層數(shù)據(jù)庫自動選擇Identity、Sequence、Hilo主鍵生成方式Identity當(dāng)時根據(jù)底層數(shù)據(jù)庫,來支持自動增長,不同的數(shù)據(jù)庫用不同的主鍵增長方式28.請簡要的描述一下使用Hibernate進行大批量更新的經(jīng)驗直接使用hibernate API 進行批量更新和批量刪除都不推薦,而直接通過JDBC API執(zhí)行相關(guān)的SQl語句或調(diào)用相關(guān)的存儲過程是最佳的方式。29.請簡要的描述一下使用Hibernate二級高速緩存的經(jīng)驗1Hibernate3的二級緩存和session級別的緩存一樣都只對實體對象做緩存,不對屬性級別的查詢做緩存;二級緩存的生命周期和sessionFactory的生命周期是一樣的,sessionFactory可以管理二級緩存;2sessionFactory級別的緩存,需要手動配置;所有的session可以共享sessionFactory 級別的緩存;(一般把一些不經(jīng)常變化的實體對象放到sessionFactory級別的緩存中,適合放不經(jīng)常變化的實體對象。)3Hiberante3二級緩存的配置和使用方法如下:必須把ehcache.jar包導(dǎo)入,然后到Hibernate3.2的etc文件下把ehcache.xml復(fù)制到工程src目錄下(ehcache.xml里邊的參數(shù)里邊有詳細英文說明);說明:ehcache.jar是第三方法的緩存產(chǎn)品,hiberante只是把它做了集成,還有好多第三方hibernate集成的緩存產(chǎn)品,相關(guān)說明請查閱hiberante3開發(fā)手冊;ehcache是不支持分布應(yīng)用的,如果有分布式需求,請換成支持分布式的二級緩存產(chǎn)品,hiberate3開發(fā)手冊都有相頭說明。配置方法都類似);4Hibernate3的二級緩存默認是開起的,也可以指定開起。12.Hibernate的延遲加載怎么看?當(dāng)Hibernate查詢數(shù)據(jù)的時候,數(shù)據(jù)并沒有存在于內(nèi)存中,當(dāng)數(shù)據(jù)真正對數(shù)據(jù)操作時,才存在于內(nèi)存中,就實現(xiàn)了延遲加載,他節(jié)省了服務(wù)器內(nèi)存的開銷,從而提升了服務(wù)器的性能。13.hibernate的sessionFactory說說是管理session的一個工廠,由sessionFactory的相關(guān)方法返回session對象,而不是平常的new關(guān)鍵字創(chuàng)建session,它的另一個好處就是,你只管要session而不用管它是如何產(chǎn)生的。這樣在效率和安全性是比較好的。什么事O/RM?對象關(guān)心映射是一種為了解決面向?qū)ο笈c關(guān)心數(shù)據(jù)庫互不匹配的技術(shù)。簡單的說,orm是通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將java程序中的對象自動持久化到關(guān)系數(shù)據(jù)庫中,本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另一種形式。在o/rm中java中的類名,屬性,對象分別轉(zhuǎn)換為數(shù)據(jù)庫中的什么?類名-表名屬性-字段對象-記錄=Hibernate筆試題=(1)一般情況下,關(guān)系數(shù)據(jù)模型與對象模型之間有哪些匹配關(guān)系(多選)A)表對應(yīng)類B)記錄對應(yīng)對象C)表的字段對應(yīng)類的屬性D)表之間的參考關(guān)系對應(yīng)類之間的依賴關(guān)系(2)以下關(guān)于SessionFactory的說法哪些正確?(多選)A)對于每個數(shù)據(jù)庫事務(wù),應(yīng)該創(chuàng)建一個SessionFactory對象B)一個SessionFactory對象對應(yīng)一個數(shù)據(jù)庫存儲源。C)SessionFactory是重量級的對象,不應(yīng)該隨意創(chuàng)建。如果系統(tǒng)中只有一個數(shù)據(jù)庫存儲源,只需要創(chuàng)建一個。D)SessionFactory的load()方法用于加載持久化對象(3)Customer類中有一個Set類型的orders屬性,用來存放Order訂單對象,在Customer.hbm.xml文件中,用哪個元素映射orders屬性?A) B) C) D)(4)元素有一個cascade屬性,如果希望Hibernate級聯(lián)保存集合中的對象,casecade屬性應(yīng)該取什么值?(單選)A)noneB)saveC)deleteD)save-update(5)以下哪些屬于Session的方法?A)load()B)save()C)delete()D)update()E)open()F)close()(6)以下程序的打印結(jié)果是什么?(單選)tx = session.beginTransaction();Customer c1=(Customer)session.load(Customer.class,new Long(1);Customer c2=(Customer)session.load(Customer.class,new Long(1);System.out.println(c1=c2);mit();session.close();A)運行出錯,拋出異常B)打印falseC)打印true(7)以下程序代碼對Customer的name屬性修改了兩次:tx = session.beginTransaction();Customer customer=(Customer)session.load(Customer.class,new Long(1);customer.setName(Jack);customer.setName(Mike);mit();執(zhí)行以上程序,Hibernate需要向數(shù)據(jù)庫提交幾條update語句?(單選)A)0 B)1 C)2 D)3(8)在持久化層,對象分為哪些狀態(tài)?(多選)A)臨時狀態(tài)B)獨立狀態(tài)C)游離狀態(tài)D)持久化狀態(tài)(9)對于以下程序,Customer對象在第幾行變?yōu)槌志没癄顟B(tài)?(單選)Customer customer=new Customer(); /line1customer.setName(Tom); /line2Session session1=sessionFactory.openSession(); /line3Transaction tx1 = session1.beginTransaction(); /line4session1.save(customer); /mit(); /line5session1.close(); /line6A) line1 B)line2 C)line3 D)lin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論