成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Hibernate最全面試題

張利勇 / 2969人閱讀

摘要:中怎樣實(shí)現(xiàn)類之間的關(guān)系如一對(duì)多多對(duì)多的關(guān)系中怎樣實(shí)現(xiàn)類之間的關(guān)系如一對(duì)多多對(duì)多的關(guān)系它們通過(guò)配置文件中的來(lái)實(shí)現(xiàn)類之間的關(guān)聯(lián)關(guān)系的。

Hibernate常見(jiàn)面試題 Hibernate工作原理及為什么要用?
Hibernate工作原理及為什么要用?

讀取并解析配置文件

讀取并解析映射信息,創(chuàng)建SessionFactory

打開(kāi)Sesssion

創(chuàng)建事務(wù)Transation

持久化操作

提交事務(wù)

關(guān)閉Session

關(guān)閉SesstionFactory

使用Hibernate框架就不用我們寫(xiě)很多繁瑣的SQL語(yǔ)句。Hibernate實(shí)現(xiàn)了ORM,能夠?qū)?duì)象映射成數(shù)據(jù)庫(kù)表,從而簡(jiǎn)化我們的開(kāi)發(fā)!

Hibernate是如何延遲加載(懶加載)?
Hibernate是如何延遲加載(懶加載)?

通過(guò)設(shè)置屬性lazy進(jìn)行設(shè)置是否需要懶加載

當(dāng)Hibernate在查詢數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒(méi)有存在與內(nèi)存中,當(dāng)程序真正對(duì)數(shù)據(jù)的操作時(shí),對(duì)象才存在與內(nèi)存中,就實(shí)現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開(kāi)銷,從而提高了服務(wù)器的性能。

Hibernate中怎樣實(shí)現(xiàn)類之間的關(guān)系?(如:一對(duì)多、多對(duì)多的關(guān)系)
Hibernate中怎樣實(shí)現(xiàn)類之間的關(guān)系?(如:一對(duì)多、多對(duì)多的關(guān)系)

它們通過(guò)配置文件中的many-to-one、one-to-many、many-to-many來(lái)實(shí)現(xiàn)類之間的關(guān)聯(lián)關(guān)系的。

hibernate的三種狀態(tài)之間如何轉(zhuǎn)換
hibernate的三種狀態(tài)之間如何轉(zhuǎn)換

Hibernate中對(duì)象的狀態(tài):

臨時(shí)/瞬時(shí)狀態(tài)

持久化狀態(tài)

游離狀態(tài)

臨時(shí)/瞬時(shí)狀態(tài)

當(dāng)我們直接new出來(lái)的對(duì)象就是臨時(shí)/瞬時(shí)狀態(tài)的..

該對(duì)象還沒(méi)有被持久化【沒(méi)有保存在數(shù)據(jù)庫(kù)中】

不受Session的管理

持久化狀態(tài)

當(dāng)保存在數(shù)據(jù)庫(kù)中的對(duì)象就是持久化狀態(tài)了

當(dāng)調(diào)用session的save/saveOrUpdate/get/load/list等方法的時(shí)候,對(duì)象就是持久化狀態(tài)

在數(shù)據(jù)庫(kù)有對(duì)應(yīng)的數(shù)據(jù)

受Session的管理

當(dāng)對(duì)對(duì)象屬性進(jìn)行更改的時(shí)候,會(huì)反映到數(shù)據(jù)庫(kù)中!

我們來(lái)測(cè)試一下:當(dāng)對(duì)對(duì)象屬性進(jìn)行更改的時(shí)候,會(huì)反映到數(shù)據(jù)庫(kù)中!

        session.save(idCard);
        idCard.setIdCardName("我是測(cè)試持久化對(duì)象");

游離狀態(tài)

當(dāng)Session關(guān)閉了以后,持久化的對(duì)象就變成了游離狀態(tài)了...

不處于session的管理

數(shù)據(jù)庫(kù)中有對(duì)應(yīng)的記錄

有了上面的基礎(chǔ),我們就很容易說(shuō)出它們之間的轉(zhuǎn)換了

new出來(lái)的對(duì)象是瞬時(shí)狀態(tài)->保存到數(shù)據(jù)庫(kù)中(受Session管理)就是持久化狀態(tài)->將session close掉就是游離狀態(tài)

比較hibernate的三種檢索策略優(yōu)缺點(diǎn)
比較hibernate的三種檢索策略優(yōu)缺點(diǎn)

立即檢索:

優(yōu)點(diǎn): 對(duì)應(yīng)用程序完全透明,不管對(duì)象處于持久化狀態(tài),還是游離狀態(tài),應(yīng)用程序都可以方便的從一個(gè)對(duì)象導(dǎo)航到與它關(guān)聯(lián)的對(duì)象;

缺點(diǎn): 1.select語(yǔ)句太多;2.可能會(huì)加載應(yīng)用程序不需要訪問(wèn)的對(duì)象白白浪費(fèi)許多內(nèi)存空間;

立即檢索:lazy=false

延遲檢索:

優(yōu)點(diǎn): 由應(yīng)用程序決定需要加載哪些對(duì)象,可以避免可執(zhí)行多余的select語(yǔ)句,以及避免加載應(yīng)用程序不需要訪問(wèn)的對(duì)象。因此能提高檢索性能,并且能節(jié)省內(nèi)存空間;

缺點(diǎn): 應(yīng)用程序如果希望訪問(wèn)游離狀態(tài)代理類實(shí)例,必須保證他在持久化狀態(tài)時(shí)已經(jīng)被初始化;

延遲加載:lazy=true

迫切左外連接檢索:

優(yōu)點(diǎn): 1對(duì)應(yīng)用程序完全透明,不管對(duì)象處于持久化狀態(tài),還是游離狀態(tài),應(yīng)用程序都可以方便地沖一個(gè)對(duì)象導(dǎo)航到與它關(guān)聯(lián)的對(duì)象。2使用了外連接,select語(yǔ)句數(shù)目少;

缺點(diǎn): 1 可能會(huì)加載應(yīng)用程序不需要訪問(wèn)的對(duì)象,白白浪費(fèi)許多內(nèi)存空間;2復(fù)雜的數(shù)據(jù)庫(kù)表連接也會(huì)影響檢索性能;

預(yù)先抓?。?fetch=“join”

hibernate都支持哪些緩存策略
hibernate都支持哪些緩存策略

usage的屬性有4種:

放入二級(jí)緩存的對(duì)象,只讀(Read-only);

非嚴(yán)格的讀寫(xiě)(Nonstrict read/write)

讀寫(xiě); 放入二級(jí)緩存的對(duì)象可以讀、寫(xiě)(Read/write);

基于事務(wù)的策略(Transactional)

hibernate里面的sorted collection 和ordered collection有什么區(qū)別
hibernate里面的sorted collection 和ordered collection有什么區(qū)別

sorted collection

是在內(nèi)存中通過(guò)Java比較器進(jìn)行排序的

ordered collection

是在數(shù)據(jù)庫(kù)中通過(guò)order by進(jìn)行排序的

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

說(shuō)下Hibernate的緩存機(jī)制
說(shuō)下Hibernate的緩存機(jī)制

一級(jí)緩存:

Hibenate中一級(jí)緩存,也叫做session的緩存,它可以在session范圍內(nèi)減少數(shù)據(jù)庫(kù)的訪問(wèn)次數(shù)! 只在session范圍有效! Session關(guān)閉,一級(jí)緩存失效!

只要是持久化對(duì)象狀態(tài)的,都受Session管理,也就是說(shuō),都會(huì)在Session緩存中!

Session的緩存由hibernate維護(hù),用戶不能操作緩存內(nèi)容; 如果想操作緩存內(nèi)容,必須通過(guò)hibernate提供的evit/clear方法操作

二級(jí)緩存:

二級(jí)緩存是基于應(yīng)用程序的緩存,所有的Session都可以使用

Hibernate提供的二級(jí)緩存有默認(rèn)的實(shí)現(xiàn),且是一種可插配的緩存框架!如果用戶想用二級(jí)緩存,只需要在hibernate.cfg.xml中配置即可; 不想用,直接移除,不影響代碼。

如果用戶覺(jué)得hibernate提供的框架框架不好用,自己可以換其他的緩存框架或自己實(shí)現(xiàn)緩存框架都可以。

Hibernate二級(jí)緩存:存儲(chǔ)的是常用的類

Hibernate的查詢方式有幾種
Hibernate的查詢方式有幾種

對(duì)象導(dǎo)航查詢(objectcomposition)

HQL查詢

1、 屬性查詢

2、 參數(shù)查詢、命名參數(shù)查詢

3、 關(guān)聯(lián)查詢

4、 分頁(yè)查詢

5、 統(tǒng)計(jì)函數(shù)

Criteria 查詢

SQLQuery本地SQL查詢

如何優(yōu)化Hibernate?
如何優(yōu)化Hibernate?

? 數(shù)據(jù)庫(kù)設(shè)計(jì)調(diào)整

? HQL優(yōu)化

? API的正確使用(如根據(jù)不同的業(yè)務(wù)類型選用不同的集合及查詢API)

? 主配置參數(shù)(日志,查詢緩存,fetch_size, batch_size等)

? 映射文件優(yōu)化(ID生成策略,二級(jí)緩存,延遲加載,關(guān)聯(lián)優(yōu)化)

? 一級(jí)緩存的管理

? 針對(duì)二級(jí)緩存,還有許多特有的策略

詳情可參考資料:

https://www.cnblogs.com/xhj123/p/6106088.html

談?wù)凥ibernate中inverse的作用
談?wù)凥ibernate中inverse的作用

inverse屬性默認(rèn)是false,就是說(shuō)關(guān)系的兩端都來(lái)維護(hù)關(guān)系。

比如Student和Teacher是多對(duì)多關(guān)系,用一個(gè)中間表TeacherStudent維護(hù)。Gp)

如果Student這邊inverse=”true”, 那么關(guān)系由另一端Teacher維護(hù),就是說(shuō)當(dāng)插入Student時(shí),不會(huì)操作TeacherStudent表(中間表)。只有Teacher插入或刪除時(shí)才會(huì)觸發(fā)對(duì)中間表的操作。所以兩邊都inverse=”true”是不對(duì)的,會(huì)導(dǎo)致任何操作都不觸發(fā)對(duì)中間表的影響;當(dāng)兩邊都inverse=”false”或默認(rèn)時(shí),會(huì)導(dǎo)致在中間表中插入兩次關(guān)系。

如果表之間的關(guān)聯(lián)關(guān)系是“一對(duì)多”的話,那么inverse只能在“一”的一方來(lái)配置!

詳情可參考:

https://zhongfucheng.bitcron.com/post/hibernate/hibernate-inversehe-cascadeshu-xing-zhi-shi-yao-dian

JDBC hibernate 和 ibatis 的區(qū)別
JDBC hibernate 和 ibatis 的區(qū)別
jdbc:手動(dòng)

手動(dòng)寫(xiě)sql

delete、insert、update要將對(duì)象的值一個(gè)一個(gè)取出傳到sql中,不能直接傳入一個(gè)對(duì)象。

select:返回的是一個(gè)resultset,要從ResultSet中一行一行、一個(gè)字段一個(gè)字段的取出,然后封裝到一個(gè)對(duì)象中,不直接返回一個(gè)對(duì)象。

ibatis的特點(diǎn):半自動(dòng)化

sql要手動(dòng)寫(xiě)

delete、insert、update:直接傳入一個(gè)對(duì)象

select:直接返回一個(gè)對(duì)象

hibernate:全自動(dòng)

不寫(xiě)sql,自動(dòng)封裝

delete、insert、update:直接傳入一個(gè)對(duì)象

select:直接返回一個(gè)對(duì)象

在數(shù)據(jù)庫(kù)中條件查詢速度很慢的時(shí)候,如何優(yōu)化?
在數(shù)據(jù)庫(kù)中條件查詢速度很慢的時(shí)候,如何優(yōu)化?

建索引

減少表之間的關(guān)聯(lián)

優(yōu)化sql,盡量讓sql很快定位數(shù)據(jù),不要讓sql做全表查詢,應(yīng)該走索引,把數(shù)據(jù)量大的表排在前面

簡(jiǎn)化查詢字段,沒(méi)用的字段不要,已經(jīng)對(duì)返回結(jié)果的控制,盡量返回少量數(shù)據(jù)

詳情可參考:

https://mp.weixin.qq.com/s?timestamp=1520300404&src=3&ver=1&signature=W6Fo7aDHiJtK4ecUcnSJ4h9bN0vRAcTPKBTgLWSJDsMcdQReJC487RYzUIU9UFYQdmgLFyss9cKifMGFpCEVLtaLlwjj2HaDOjsCRkTnwfVlUY5cDhSyRi-c8leheofZJVnu6wYQ3IvT*hYyVB1pQCqqnuXIWERaksjXuyNP8=

什么是SessionFactory,她是線程安全么
什么是SessionFactory,她是線程安全么

SessionFactory 是Hibrenate單例數(shù)據(jù)存儲(chǔ)和線程安全的,以至于可以多線程同時(shí)訪問(wèn)。一個(gè)SessionFactory 在啟動(dòng)的時(shí)候只能建立一次。SessionFactory應(yīng)該包裝各種單例以至于它能很簡(jiǎn)單的在一個(gè)應(yīng)用代碼中儲(chǔ)存.

get和load區(qū)別
get和load區(qū)別

get()立即查詢

load()懶加載

1)get如果沒(méi)有找到會(huì)返回null, load如果沒(méi)有找到會(huì)拋出異常。

2)get會(huì)先查一級(jí)緩存, 再查二級(jí)緩存,然后查數(shù)據(jù)庫(kù);load會(huì)先查一級(jí)緩存,如果沒(méi)有找到,就創(chuàng)建代理對(duì)象, 等需要的時(shí)候去查詢二級(jí)緩存和數(shù)據(jù)庫(kù)。

merge的含義:
merge的含義:

如果session中存在相同持久化標(biāo)識(shí)(identifier)的實(shí)例,用用戶給出的對(duì)象的狀態(tài)覆蓋舊有的持久實(shí)例

如果session沒(méi)有相應(yīng)的持久實(shí)例,則嘗試從數(shù)據(jù)庫(kù)中加載,或創(chuàng)建新的持久化實(shí)例,最后返回該持久實(shí)例

用戶給出的這個(gè)對(duì)象沒(méi)有被關(guān)聯(lián)到session上,它依舊是脫管的

詳情可參考:

http://cp3.iteye.com/blog/786019

persist和save的區(qū)別
persist和save的區(qū)別

persist不保證立即執(zhí)行,可能要等到flush;

persist不更新緩存;

save, 把一個(gè)瞬態(tài)的實(shí)例持久化標(biāo)識(shí)符,及時(shí)的產(chǎn)生,它要返回標(biāo)識(shí)符,所以它會(huì)立即執(zhí)行Sql insert

使用 save() 方法保存持久化對(duì)象時(shí),該方法返回該持久化對(duì)象的標(biāo)識(shí)屬性值(即對(duì)應(yīng)記錄的主鍵值);

使用 persist() 方法來(lái)保存持久化對(duì)象時(shí),該方法沒(méi)有任何返回值

參考資料:

http://blog.csdn.net/u010739551/article/details/47253881

主鍵生成 策略有哪些
主鍵生成 策略有哪些

主鍵的自動(dòng)生成策略

identity 自增長(zhǎng)(mysql,db2)

sequence 自增長(zhǎng)(序列), oracle中自增長(zhǎng)是以序列方法實(shí)現(xiàn)**

native 自增長(zhǎng)【會(huì)根據(jù)底層數(shù)據(jù)庫(kù)自增長(zhǎng)的方式選擇identity或sequence】

如果是mysql數(shù)據(jù)庫(kù), 采用的自增長(zhǎng)方式是identity

如果是oracle數(shù)據(jù)庫(kù), 使用sequence序列的方式實(shí)現(xiàn)自增長(zhǎng)

increment 自增長(zhǎng)(會(huì)有并發(fā)訪問(wèn)的問(wèn)題,一般在服務(wù)器集群環(huán)境使用會(huì)存在問(wèn)題。)

指定主鍵生成策略為手動(dòng)指定主鍵的值

assigned

指定主鍵生成策略為UUID生成的值

uuid

foreign(外鍵的方式)

簡(jiǎn)述hibernate中g(shù)etCurrentSession和openSession區(qū)別
簡(jiǎn)述hibernate中g(shù)etCurrentSession和openSession區(qū)別

1、getCurrentSession會(huì)綁定當(dāng)前線程,而openSession不會(huì),因?yàn)槲覀儼裩ibernate交給我們的spring來(lái)管理之后,我們是有事務(wù)配置,這個(gè)有事務(wù)的線程就會(huì)綁定當(dāng)前的工廠里面的每一個(gè)session,而openSession是創(chuàng)建一個(gè)新session。

2、getCurrentSession事務(wù)是有spring來(lái)控制的,而openSession需要我們手動(dòng)開(kāi)啟和手動(dòng)提交事務(wù),

3、getCurrentSession是不需要我們手動(dòng)關(guān)閉的,因?yàn)楣S會(huì)自己管理,而openSession需要我們手動(dòng)關(guān)閉。

4、而getCurrentSession需要我們手動(dòng)設(shè)置綁定事務(wù)的機(jī)制,有三種設(shè)置方式,jdbc本地的Thread、JTA、第三種是spring提供的事務(wù)管理機(jī)制org.springframework.orm.hibernate4.SpringSessionContext,而且srping默認(rèn)使用該種事務(wù)管理機(jī)制

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

命名查詢指的是用標(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的實(shí)體類中要提供一個(gè)無(wú)參數(shù)的構(gòu)造器這一點(diǎn)非常重要?
為什么在Hibernate的實(shí)體類中要提供一個(gè)無(wú)參數(shù)的構(gòu)造器這一點(diǎn)非常重要?

每個(gè)Hibernate實(shí)體類必須包含一個(gè) 無(wú)參數(shù)的構(gòu)造器, 這是因?yàn)?strong>Hibernate框架要使用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類?

可以將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)就限制了使用可以提升性能的手段。

最后

參考資料:

http://blog.csdn.net/qq1137623160/article/details/71194677

http://blog.csdn.net/u013842976/article/details/52518218

http://blog.csdn.net/yubotianxiao/article/details/52238200

如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號(hào):Java3y

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68734.html

相關(guān)文章

  • Java面試前需要了解的東西

    摘要:我在面試前針對(duì)基礎(chǔ)也花了不少的時(shí)間,期間也將自己寫(xiě)過(guò)的博文粗略地刷了一遍,同時(shí)也在網(wǎng)上找了不少比較好的資料部分是沒(méi)看完的??疵嬖囶}也是校驗(yàn)自己是否真正理解了這個(gè)知識(shí)點(diǎn),也很有可能會(huì)有新的收獲。 一、前言 只有光頭才能變強(qiáng) 回顧前面: 廣州三本找Java實(shí)習(xí)經(jīng)歷 上一篇寫(xiě)了自己面試的經(jīng)歷和一些在面試的時(shí)候遇到的題目(筆試題和面試題)。 我在面試前針對(duì)Java基礎(chǔ)也花了不少的時(shí)間,期間也將...

    renweihub 評(píng)論0 收藏0
  • 70 個(gè) Spring 最常見(jiàn)面試題,Java 晉升必會(huì)

    摘要:容器自動(dòng)完成裝載,默認(rèn)的方式是這部分重點(diǎn)在常用模塊的使用以及的底層實(shí)現(xiàn)原理。 對(duì)于那些想面試高級(jí) Java 崗位的同學(xué)來(lái)說(shuō),除了算法屬于比較「天方夜譚」的題目外,剩下針對(duì)實(shí)際工作的題目就屬于真正的本事了,熱門(mén)技術(shù)的細(xì)節(jié)和難點(diǎn)成為了主要考察的內(nèi)容。 這里說(shuō)「天方夜譚」并不是說(shuō)算法沒(méi)用,不切實(shí)際,而是想說(shuō)算法平時(shí)其實(shí)很少用到,甚至面試官都對(duì)自己出的算法題一知半解。 這里總結(jié)打磨了 70 道...

    Ashin 評(píng)論0 收藏0
  • Mybatis常見(jiàn)面試題

    摘要:執(zhí)行沒(méi)有,批處理不支持,將所有都添加到批處理中,等待統(tǒng)一執(zhí)行,它緩存了多個(gè)對(duì)象,每個(gè)對(duì)象都是完畢后,等待逐一執(zhí)行批處理。 Mybatis常見(jiàn)面試題 #{}和${}的區(qū)別是什么? #{}和${}的區(qū)別是什么? 在Mybatis中,有兩種占位符 #{}解析傳遞進(jìn)來(lái)的參數(shù)數(shù)據(jù) ${}對(duì)傳遞進(jìn)來(lái)的參數(shù)原樣拼接在SQL中 #{}是預(yù)編譯處理,${}是字符串替換。 使用#{}可以有效的防止...

    liuchengxu 評(píng)論0 收藏0
  • Java3y文章目錄導(dǎo)航

    摘要:前言由于寫(xiě)的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 前言 由于寫(xiě)的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時(shí)間才會(huì)更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號(hào):Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡(jiǎn)單 注解就這么簡(jiǎn)單 Druid數(shù)據(jù)庫(kù)連接池...

    KevinYan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<