偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Hibernate的10個(gè)常見(jiàn)面試問(wèn)題及答案

開發(fā) 開發(fā)工具 前端
在Java J2EE方面進(jìn)行面試時(shí),常被問(wèn)起的Hibernate面試問(wèn)題,大多都是針對(duì)基于Web的企業(yè)級(jí)應(yīng)用開發(fā)者的角色的。Hibernate框架在Java 界的成功和高度的可接受性使得它成為了Java技術(shù)棧中最受歡迎的對(duì)象關(guān)系影射(ORM)解決方案。

在Java J2EE方面進(jìn)行面試時(shí),常被問(wèn)起的Hibernate面試問(wèn)題,大多都是針對(duì)基于Web的企業(yè)級(jí)應(yīng)用開發(fā)者的角色的。Hibernate框架在Java 界的成功和高度的可接受性使得它成為了Java技術(shù)棧中最受歡迎的對(duì)象關(guān)系影射(ORM)解決方案。Hibernate將你從數(shù)據(jù)庫(kù)相關(guān)的編碼中解脫了出來(lái),使你可以更加專注地利用強(qiáng)大的面向?qū)ο蟮脑O(shè)計(jì)原則來(lái)實(shí)現(xiàn)核心的業(yè)務(wù)邏輯。采用Hibernate后,你就能夠相當(dāng)容易地在不同的數(shù)據(jù)庫(kù)間進(jìn)行切換,而且你還可以利用Hibernate提供的開箱即用的二級(jí)緩存以及查詢緩存功能。你也知道,大部分Java面試中所提的問(wèn)題不僅僅會(huì)涉及Java的核心部分,而且還會(huì)涉及其它的Java框架,比如,根據(jù)項(xiàng)目的要求也有可能會(huì)問(wèn)到Spring 框架方面的問(wèn)題或者Struts方面的問(wèn)題。如果你要參加的項(xiàng)目使用了Hibernate作為ORM解決方案,你就英國(guó)同時(shí)準(zhǔn)備好回答Spring和Hibernate這兩個(gè)框架方面的問(wèn)題。好好看看JD或者職位說(shuō)明,如果其中的任何地方出現(xiàn)了Hibernate這個(gè)詞,就要準(zhǔn)備好怎樣來(lái)面對(duì)Hibernate方面的問(wèn)題。

本文給出了一個(gè)Hibernate面試問(wèn)題列表,這些都是我從朋友以及同事那里搜集來(lái)的。Hibernate 是一個(gè)非常流行的對(duì)象關(guān)系影射框架,熟稔Hibernate的優(yōu)勢(shì)所在和Hibernate的Sesion API是搞定Hibernate面試之關(guān)鍵所在。

Hibernate中g(shù)et和load有什么不同之處? 把get和load放到一起進(jìn)行對(duì)比是Hibernate面試時(shí)最常問(wèn)到的問(wèn)題,這是因?yàn)橹挥姓_理解get()和load()這二者后才有可能高效地使用Hibernate。get和load的最大區(qū)別是,如果在緩存中沒(méi)有找到相應(yīng)的對(duì)象,get將會(huì)直接訪問(wèn)數(shù)據(jù)庫(kù)并返回一個(gè)完全初始化好的對(duì)象,而這個(gè)過(guò)程有可能會(huì)涉及到多個(gè)數(shù)據(jù)庫(kù)調(diào)用;而load方法在緩存中沒(méi)有發(fā)現(xiàn)對(duì)象的情況下,只會(huì)返回一個(gè)代理對(duì)象,只有在對(duì)象getId()之外的其它方法被調(diào)用時(shí)才會(huì)真正去訪問(wèn)數(shù)據(jù)庫(kù),這樣就能在某些情況下大幅度提高性能。你也可以參考 Hibernate中g(shù)et和load的不同之處, 此鏈接給出了更多的不同之處并對(duì)該問(wèn)題進(jìn)行了更細(xì)致的討論。

Hibernate中save、persist和saveOrUpdate這三個(gè)方法的不同之處? 除了get和load,這又是另外一個(gè)經(jīng)常出現(xiàn)的Hibernate面試問(wèn)題。 所有這三個(gè)方法,也就是save()、saveOrUpdate()和persist()都是用于將對(duì)象保存到數(shù)據(jù)庫(kù)中的方法,但其中有些細(xì)微的差別。例如,save()只能INSERT記錄,但是saveOrUpdate()可以進(jìn)行 記錄的INSERT和UPDATE。還有,save()的返回值是一個(gè)Serializable對(duì)象,而persist()方法返回值為void。你還可以訪問(wèn) save、persist以及saveOrUpdate,找到它們所有的不同之處。

Hibernate中的命名SQL查詢指的是什么? Hibernate的這個(gè)面試問(wèn)題同Hibernate提供的查詢功能相關(guān)。命名查詢指的是用<sql-query>標(biāo)簽在影射文檔中定義的SQL查詢,可以通過(guò)使用Session.getNamedQuery()方法對(duì)它進(jìn)行調(diào)用。命名查詢使你可以使用你所指定的一個(gè)名字拿到某個(gè)特定的查詢。 Hibernate中的命名查詢可以使用注解來(lái)定義,也可以使用我前面提到的xml影射問(wèn)句來(lái)定義。在Hibernate中,@NameQuery用來(lái)定義單個(gè)的命名查詢,@NameQueries用來(lái)定義多個(gè)命名查詢。

Hibernate中的SessionFactory有什么作用? SessionFactory是線程安全的嗎? 這也是Hibernate框架的常見(jiàn)面試問(wèn)題。顧名思義,SessionFactory就是一個(gè)用于創(chuàng)建Hibernate的Session對(duì)象的工廠。 SessionFactory通常是在應(yīng)用啟動(dòng)時(shí)創(chuàng)建好的,應(yīng)用程序中的代碼用它來(lái)獲得Session對(duì)象。作為一個(gè)單個(gè)的數(shù)據(jù)存儲(chǔ),它也是 線程安全的,所以多個(gè)線程可同時(shí)使用同一個(gè)SessionFactory。Java JEE應(yīng)用一般只有一個(gè)SessionFactory,服務(wù)于客戶請(qǐng)求的各線程都通過(guò)這個(gè)工廠來(lái)獲得Hibernate的Session實(shí)例,這也是為什么SessionFactory接口的實(shí)現(xiàn)必須是線程安全的原因。還有,SessionFactory的內(nèi)部狀態(tài)包含著同對(duì)象關(guān)系影射有關(guān)的所有元數(shù)據(jù),它是 不可變的,一旦創(chuàng)建好后就不能對(duì)其進(jìn)行修改了。

Hibernate中的Session指的是什么? 可否將單個(gè)的Session在多個(gè)線程間進(jìn)行共享? 前面的問(wèn)題問(wèn)完之后,通常就會(huì)接著再問(wèn)這兩個(gè)問(wèn)題。問(wèn)完SessionFactory的問(wèn)題后就該輪到Session了。Session代表著Hibernate所做的一小部分工作,它負(fù)責(zé)維護(hù)者同數(shù)據(jù)庫(kù)的鏈接而且 不是線程安全的,也就是說(shuō),Hibernage中的Session不能在多個(gè)線程間進(jìn)行共享。雖然Session會(huì)以主動(dòng)滯后的方式獲得數(shù)據(jù)庫(kù)連接,但是Session最好還是在用完之后立即將其關(guān)閉。

hibernate中sorted collection和ordered collection有什么不同? T這個(gè)是你會(huì)碰到的所有Hibernate面試問(wèn)題中比較容易的問(wèn)題。sorted collection是通過(guò)使用 Java的Comparator在內(nèi)存中進(jìn)行排序的,ordered collection中的排序用的是數(shù)據(jù)庫(kù)的order by子句。對(duì)于比較大的數(shù)據(jù)集,為了避免在內(nèi)存中對(duì)它們進(jìn)行排序而出現(xiàn) Java中的OutOfMemoryError,最好使用ordered collection。

Hibernate中transient、persistent、detached對(duì)象三者之間有什么區(qū)別? 在Hibernate中,對(duì)象具有三種狀態(tài):transient、persistent和detached。同Hibernate的session有關(guān)聯(lián)的對(duì)象是persistent對(duì)象。對(duì)這種對(duì)象進(jìn)行的所有修改都會(huì)按照事先設(shè)定的刷新策略,反映到數(shù)據(jù)庫(kù)之中,也即,可以在對(duì)象的任何一個(gè)屬性發(fā)生改變時(shí)自動(dòng)刷新,也可以通過(guò)調(diào)用Session.flush()方法顯式地進(jìn)行刷新。如果一個(gè)對(duì)象原來(lái)同Session有關(guān)聯(lián)關(guān)系,但當(dāng)下卻沒(méi)有關(guān)聯(lián)關(guān)系了,這樣的對(duì)象就是detached的對(duì)象。你可以通過(guò)調(diào)用任意一個(gè)session的update()或者saveOrUpdate()方法,重新將該 detached對(duì)象同相應(yīng)的seesion建立關(guān)聯(lián)關(guān)系。Transient對(duì)象指的是新建的持久化類的實(shí)例,它還從未同Hibernate的任何 Session有過(guò)關(guān)聯(lián)關(guān)系。同樣的,你可以調(diào)用persist()或者save()方法,將transient對(duì)象變成persistent對(duì)象??梢涀。@里所說(shuō)的transient指的可不是 Java中的transient關(guān)鍵字,二者風(fēng)馬牛不相及。

Hibernate中Session的lock()方法有什么作用? 這是一個(gè)比較棘手的Hibernate面試問(wèn)題,因?yàn)镾ession的lock()方法重建了關(guān)聯(lián)關(guān)系卻并沒(méi)有同數(shù)據(jù)庫(kù)進(jìn)行同步和更新。因此,你在使用 lock()方法時(shí)一定要多加小心。順便說(shuō)一下,在進(jìn)行關(guān)聯(lián)關(guān)系重建時(shí),你可以隨時(shí)使用Session的update()方法同數(shù)據(jù)庫(kù)進(jìn)行同步。有時(shí)這個(gè)問(wèn)題也可以這么來(lái)問(wèn):Session的lock()方法和update()方法之間有什么區(qū)別?。這個(gè)小節(jié)中的關(guān)鍵點(diǎn)也可以拿來(lái)回答這個(gè)問(wèn)題。

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

Hibernate中的查詢緩存指的是什么? 這個(gè)問(wèn)題有時(shí)是作為上個(gè)Hibernate面試問(wèn)題的后繼問(wèn)題提出的。查詢緩存實(shí)際上保存的是sql查詢的結(jié)果,這樣再進(jìn)行相同的sql查詢就可以之間從緩存中拿到結(jié)果了。為了改善性能,查詢緩存可以同二級(jí)緩存一起來(lái)使用。Hibernate支持用多種不同的開源緩存方案,比如EhCache,來(lái)實(shí)現(xiàn)查詢緩存。

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

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

可不可以將Hibernate的實(shí)體類定義為final類?
是的,你可以將Hibernate的實(shí)體類定義為final類,但這種做法并不好。因?yàn)镠ibernate會(huì)使用代理模式在延遲關(guān)聯(lián)的情況下提高性能,如果你把實(shí)體類定義成final類之后,因?yàn)?Java不允許對(duì)final類進(jìn)行擴(kuò)展,所以Hibernate就無(wú)法再使用代理了,如此一來(lái)就限制了使用可以提升性能的手段。不過(guò),如果你的持久化類實(shí)現(xiàn)了一個(gè)接口而且在該接口中聲明了所有定義于實(shí)體類中的所有public的方法輪到話,你就能夠避免出現(xiàn)前面所說(shuō)的不利后果。

Java開發(fā)者的Hibernate面試問(wèn)答列表就到此為止了。沒(méi)人會(huì)對(duì)Hibernate作為ORM解決方案的受歡迎程度產(chǎn)生懷疑,如果你要申請(qǐng)的是 Java J2EE方面的職位,你就等著人來(lái)問(wèn)你Hibernate方面的面試問(wèn)題吧。在JEE界,Spring和Hibernate是兩個(gè)最流行的Java框架。要是你被問(wèn)到了其它也值得分享的Hibernate方面的面試問(wèn)題, 別忘了在Java社區(qū)中同大家分享一下。

英文原文:10 Hibernate Interview Questions and Answers for Java J2EE Programmers

譯文鏈接:http://www.oschina.net/translate/10-hibernate-interview-questions-answers-java-j2ee-senior

責(zé)任編輯:林師授 來(lái)源: OSCHINA編譯
相關(guān)推薦

2021-02-10 07:38:43

Node.js后端框架

2018-09-05 12:20:09

數(shù)據(jù)庫(kù)Redis面試題

2024-04-11 13:38:19

大型語(yǔ)言模型

2018-08-21 13:25:01

編程語(yǔ)言Java面試題

2014-02-27 15:42:08

Linux面試

2023-02-10 16:36:30

機(jī)器學(xué)習(xí)評(píng)估指標(biāo)

2017-09-15 10:36:17

前端JavaScript面試題

2009-06-02 15:11:11

Hibernate面試題查詢

2017-02-10 10:10:46

Hadoop面試數(shù)據(jù)倉(cāng)庫(kù)

2013-12-03 10:11:41

LinuxLinux面試題

2022-01-14 08:12:39

瀏覽器面試問(wèn)http

2015-05-11 14:02:21

JavaJava集合面試問(wèn)題答案

2015-09-29 09:24:22

Node.js面試題

2020-03-23 09:56:50

軟件測(cè)試面試技術(shù)

2018-07-25 14:27:43

Redis數(shù)據(jù)架構(gòu)存儲(chǔ)

2018-01-11 16:29:19

錯(cuò)誤HibernateJPQL

2020-06-16 09:02:36

Linux Shell腳本

2014-05-28 09:26:57

Linux Shellshell腳本

2014-07-25 17:21:43

Linux Shell面試

2009-06-16 13:41:19

Hibernate面試Hibernate面試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)