Hibernate面試題有哪些-創(chuàng)新互聯(lián)

這篇文章主要介紹“Hibernate面試題有哪些”,在日常操作中,相信很多人在Hibernate面試題有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Hibernate面試題有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)專注于木壘哈薩克網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供木壘哈薩克營銷型網(wǎng)站建設(shè),木壘哈薩克網(wǎng)站制作、木壘哈薩克網(wǎng)頁設(shè)計(jì)、木壘哈薩克網(wǎng)站官網(wǎng)定制、成都小程序開發(fā)服務(wù),打造木壘哈薩克網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供木壘哈薩克網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

1、什么是Hibernate?

Hibernate是一個(gè)架構(gòu), 用來對應(yīng)Java對象數(shù)據(jù)庫表對象。使用一個(gè)xml文件來配置。

2、為什么要使用 Hibernate?

①Hibernate 是對 jdbc 的封裝,大大簡化了數(shù)據(jù)訪問層的繁瑣的重復(fù)性代碼。

②Hibernate 是一個(gè)優(yōu)秀的 ORM 實(shí)現(xiàn),很多程度上簡化了 DAO 層的編碼功能。

③可以很方便的進(jìn)行數(shù)據(jù)庫的移植工作。

④提供了緩存機(jī)制,是程序執(zhí)行更改的高效。

3、什么是 ORM 框架?

ORM(Object Relation Mapping)對象關(guān)系映射,是把數(shù)據(jù)庫中的關(guān)系數(shù)據(jù)映射成為程序中的對象。

使用 ORM 的優(yōu)點(diǎn):提高了開發(fā)效率降低了開發(fā)成本、開發(fā)更簡單更對象化、可移植更強(qiáng)。

4、Hibernate 中如何在控制臺查看打印的 SQL 語句?

在Config里面把 Hibernate. show_SQL 設(shè)置為 true 就可以。但不建議開啟,開啟之后會降低程序的運(yùn)行效率。

5、Hibernate中g(shù)et和load有什么不同之處?

把get和load放到一起進(jìn)行對比是Hibernate面試時(shí)最常問到的問題,這是因?yàn)橹挥姓_理解get()和load()這二者后才有可能高效地使用Hibernate。

get和load的大區(qū)別是,如果在緩存中沒有找到相應(yīng)的對象,get將會直接訪問數(shù)據(jù)庫并返回一個(gè)完全初始化好的對象,而這個(gè)過程有可能會涉及到多個(gè)數(shù)據(jù)庫調(diào)用。

而load方法在緩存中沒有發(fā)現(xiàn)對象的情況下,只會返回一個(gè)代理對象,只有在對象getId()之外的其它方法被調(diào)用時(shí)才會真正去訪問數(shù)據(jù)庫,這樣就能在某些情況下大幅度提高性能。

你也可以參考 Hibernate中g(shù)et和load的不同之處, 此鏈接給出了更多的不同之處并對該問題進(jìn)行了更細(xì)致的討論。

6、Hibernate 是如何工作的?

①讀取并解析配置文件。

②讀取并解析映射文件,創(chuàng)建SessionFactory。

③打開 Session。

④創(chuàng)建事務(wù)。

⑤進(jìn)行持久化操作。

⑥提交事務(wù)。

⑦關(guān)閉 Session。

⑧關(guān)閉 SessionFactory。

7、Hibernate中save、persist和saveOrUpdate這三個(gè)方法的不同之處?

除了get和load,這又是另外一個(gè)經(jīng)常出現(xiàn)的Hibernate面試問題。 所有這三個(gè)方法,也就是save()、saveOrUpdate()和persist()都是用于將對象保存到數(shù)據(jù)庫中的方法,但其中有些細(xì)微的差別。

例如,save()只能INSERT記錄,但是saveOrUpdate()可以進(jìn)行 記錄的INSERT和UPDATE。

還有,save()的返回值是一個(gè)Serializable對象,而persist()方法返回值為void。你還可以訪問 save、persist以及saveOrUpdate,找到它們所有的不同之處。

8、Hibernate中的命名SQL查詢指的是什么?

Hibernate的這個(gè)面試問題同Hibernate提供的查詢功能相關(guān)。命名查詢指的是用標(biāo)簽在影射文檔中定義的SQL查詢,可以通過使用Session.getNamedQuery()方法對它進(jìn)行調(diào)用。

命名查詢使你可以使用你所指定的一個(gè)名字拿到某個(gè)特定的查詢。 Hibernate中的命名查詢可以使用注解來定義,也可以使用我前面提到的xml影射問句來定義。

在Hibernate中,@NameQuery用來定義單個(gè)的命名查詢,@NameQueries用來定義多個(gè)命名查詢。

9、在 Hibernate 中 Java 對象的狀態(tài)有哪些 ?

①臨時(shí)狀態(tài)(transient):不處于 Session 的緩存中。OID 為 null 或 等于 id 的 unsaved-value 屬性值 。

②持久化狀態(tài)(persistent):加入到 Session 的緩存中。

③游離狀態(tài)(detached):已經(jīng)被持久化,但不再處于 Session 的緩存中。

10、Hibernate中的SessionFactory有什么作用?

SessionFactory是線程安全的嗎? 這也是Hibernate框架的常見面試問題。顧名思義,SessionFactory就是一個(gè)用于創(chuàng)建Hibernate的Session對象的工廠。

SessionFactory通常是在應(yīng)用啟動(dòng)時(shí)創(chuàng)建好的,應(yīng)用程序中的代碼用它來獲得Session對象。作為一個(gè)單個(gè)的數(shù)據(jù)存儲,它也是 線程安全的,所以多個(gè)線程可同時(shí)使用同一個(gè)SessionFactory。

Java JEE應(yīng)用一般只有一個(gè)SessionFactory,服務(wù)于客戶請求的各線程都通過這個(gè)工廠來獲得Hibernate的Session實(shí)例,這也是為什么SessionFactory接口的實(shí)現(xiàn)必須是線程安全的原因。

還有,SessionFactory的內(nèi)部狀態(tài)包含著同對象關(guān)系影射有關(guān)的所有元數(shù)據(jù),它是不可變的,一旦創(chuàng)建好后就不能對其進(jìn)行修改了。

11、Hibernate中的Session指的是什么? 可否將單個(gè)的Session在多個(gè)線程間進(jìn)行共享?

前面的問題問完之后,通常就會接著再問這兩個(gè)問題。問完SessionFactory的問題后就該輪到Session了。Session代表著Hibernate所做的一小部分工作,它負(fù)責(zé)維護(hù)者同數(shù)據(jù)庫的鏈接而且不是線程安全的。

也就是說,Hibernage中的Session不能在多個(gè)線程間進(jìn)行共享。雖然Session會以主動(dòng)滯后的方式獲得數(shù)據(jù)庫連接,但是Session最好還是在用完之后立即將其關(guān)閉。

12、Hibernate中sorted collection和ordered collection有什么不同?

這個(gè)是你會碰到的所有Hibernate面試問題中比較容易的問題。sorted collection是通過使用 Java的Comparator在內(nèi)存中進(jìn)行排序的,ordered collection中的排序用的是數(shù)據(jù)庫的order by子句。

對于比較大的數(shù)據(jù)集,為了避免在內(nèi)存中對它們進(jìn)行排序而出現(xiàn) Java中的OutOfMemoryError,最好使用ordered collection。

13、Hibernate中transient、persistent、detached對象三者之間有什么區(qū)別?

在Hibernate中,對象具有三種狀態(tài):transient、persistent和detached。同Hibernate的session有關(guān)聯(lián)的對象是persistent對象。

對這種對象進(jìn)行的所有修改都會按照事先設(shè)定的刷新策略,反映到數(shù)據(jù)庫之中,也即,可以在對象的任何一個(gè)屬性發(fā)生改變時(shí)自動(dòng)刷新,也可以通過調(diào)用Session.flush()方法顯式地進(jìn)行刷新。

如果一個(gè)對象原來同Session有關(guān)聯(lián)關(guān)系,但當(dāng)下卻沒有關(guān)聯(lián)關(guān)系了,這樣的對象就是detached的對象。你可以通過調(diào)用任意一個(gè)session的()或者saveOrUpdate()方法,重新將該detached對象同相應(yīng)的seesion建立關(guān)聯(lián)關(guān)系。

Transient對象指的是新建的持久化類的實(shí)例,它還從未同Hibernate的任何Session有過關(guān)聯(lián)關(guān)系。同樣的,你可以調(diào)用persist()或者save()方法,將transient對象變成persistent對象。

可要記住,這里所說的transient指的可不是 Java中的transient關(guān)鍵字,二者風(fēng)馬牛不相及。

14、Hibernate中Session的lock()方法有什么作用?

這是一個(gè)比較棘手的Hibernate面試問題,因?yàn)镾ession的lock()方法重建了關(guān)聯(lián)關(guān)系卻并沒有同數(shù)據(jù)庫進(jìn)行同步和更新。因此,你在使用lock()方法時(shí)一定要多加小心。

順便說一下,在進(jìn)行關(guān)聯(lián)關(guān)系重建時(shí),你可以隨時(shí)使用Session的()方法同數(shù)據(jù)庫進(jìn)行同步。有時(shí)這個(gè)問題也可以這么來問:Session的lock()方法和()方法之間有什么區(qū)別?。這個(gè)小節(jié)中的關(guān)鍵點(diǎn)也可以拿來回答這個(gè)問題。

15、Hibernate中二級緩存指的是什么?

這是同Hibernate的緩存機(jī)制相關(guān)的第一個(gè)面試問題,不出意外后面還會有更多這方面的問題。二級緩存是在SessionFactory這個(gè)級別維護(hù)的緩存,它能夠通過節(jié)省幾番數(shù)據(jù)庫調(diào)用往返來提高性能。還有一點(diǎn)值得注意,二級緩存是針對整個(gè)應(yīng)用而不是某個(gè)特定的session的。

16、Hibernate中的查詢緩存指的是什么?

這個(gè)問題有時(shí)是作為上個(gè)Hibernate面試問題的后繼問題提出的。查詢緩存實(shí)際上保存的是sql查詢的結(jié)果,這樣再進(jìn)行相同的sql查詢就可以之間從緩存中拿到結(jié)果了。

為了改善性能,查詢緩存可以同二級緩存一起來使用。Hibernate支持用多種不同的開源緩存方案,比如EhCache,來實(shí)現(xiàn)查詢緩存。

17、為什么在Hibernate的實(shí)體類中要提供一個(gè)無參數(shù)的構(gòu)造器這一點(diǎn)非常重要?

每個(gè)Hibernate實(shí)體類必須包含一個(gè) 無參數(shù)的構(gòu)造器, 這是因?yàn)镠ibernate框架要使用Reflection API,通過調(diào)用Class.newInstance()來創(chuàng)建這些實(shí)體類的實(shí)例。如果在實(shí)體類中找不到無參數(shù)的構(gòu)造器,這個(gè)方法就會拋出一個(gè)InstantiationException異常。

18、可不可以將Hibernate的實(shí)體類定義為final類?

是的,你可以將Hibernate的實(shí)體類定義為final類,但這種做法并不好。因?yàn)镠ibernate會使用代理模式在延遲關(guān)聯(lián)的情況下提高性能,如果你把實(shí)體類定義成final類之后,因?yàn)? Java不允許對final類進(jìn)行擴(kuò)展,所以Hibernate就無法再使用代理了,如此一來就限制了使用可以提升性能的手段。

不過,如果你的持久化類實(shí)現(xiàn)了一個(gè)接口而且在該接口中聲明了所有定義于實(shí)體類中的所有public的方法,你就能夠避免出現(xiàn)前面所說的不利后果。

19、Hibernate的優(yōu)缺點(diǎn)

①優(yōu)點(diǎn):

> 對 JDBC 訪問數(shù)據(jù)庫的代碼做了封裝,簡化了數(shù)據(jù)訪問層繁瑣的重復(fù) 性代碼 ;

> 映射的靈活性, 它支持各種關(guān)系數(shù)據(jù)庫, 從一對一到多對多的各種復(fù) 雜關(guān)系;

> 非侵入性、移植性會好;

> 緩存機(jī)制: 提供一級緩存和二級緩存。

②缺點(diǎn):

> 無法對 SQL 進(jìn)行優(yōu)化 ;

> 框架中使用 ORM 原則, 導(dǎo)致配置過于復(fù)雜;

> 執(zhí)行效率和原生的 JDBC 相比偏差: 特別是在批量數(shù)據(jù)處理的時(shí)候 ;

> 不支持批量修改、刪除 。

20、Hibernate 實(shí)體類必須要有無參構(gòu)造函數(shù)嗎?為什么?

Hibernate 中每個(gè)實(shí)體類必須提供一個(gè)無參構(gòu)造函數(shù),因?yàn)?Hibernate 框架要使用 reflection api,通過調(diào)用 ClassnewInstance() 來創(chuàng)建實(shí)體類的實(shí)例,如果沒有無參的構(gòu)造函數(shù)就會拋出異常。

到此,關(guān)于“Hibernate面試題有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

本文名稱:Hibernate面試題有哪些-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://muchs.cn/article38/dchesp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)公司外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站策劃微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司