摘要:中怎樣實現(xiàn)類之間的關(guān)系如一對多多對多的關(guān)系中怎樣實現(xiàn)類之間的關(guān)系如一對多多對多的關(guān)系它們通過配置文件中的來實現(xiàn)類之間的關(guān)聯(lián)關(guān)系的。
Hibernate常見面試題 Hibernate工作原理及為什么要用?
Hibernate工作原理及為什么要用?
讀取并解析配置文件
讀取并解析映射信息,創(chuàng)建SessionFactory
打開Sesssion
創(chuàng)建事務(wù)Transation
持久化操作
提交事務(wù)
關(guān)閉Session
關(guān)閉SesstionFactory
使用Hibernate框架就不用我們寫很多繁瑣的SQL語句。Hibernate實現(xiàn)了ORM,能夠?qū)ο笥成涑蓴?shù)據(jù)庫表,從而簡化我們的開發(fā)!
Hibernate是如何延遲加載(懶加載)?Hibernate是如何延遲加載(懶加載)?
通過設(shè)置屬性lazy進行設(shè)置是否需要懶加載
當(dāng)Hibernate在查詢數(shù)據(jù)的時候,數(shù)據(jù)并沒有存在與內(nèi)存中,當(dāng)程序真正對數(shù)據(jù)的操作時,對象才存在與內(nèi)存中,就實現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開銷,從而提高了服務(wù)器的性能。
Hibernate中怎樣實現(xiàn)類之間的關(guān)系?(如:一對多、多對多的關(guān)系)Hibernate中怎樣實現(xiàn)類之間的關(guān)系?(如:一對多、多對多的關(guān)系)
它們通過配置文件中的many-to-one、one-to-many、many-to-many來實現(xiàn)類之間的關(guān)聯(lián)關(guān)系的。
hibernate的三種狀態(tài)之間如何轉(zhuǎn)換hibernate的三種狀態(tài)之間如何轉(zhuǎn)換
Hibernate中對象的狀態(tài):
臨時/瞬時狀態(tài)
持久化狀態(tài)
游離狀態(tài)
臨時/瞬時狀態(tài)當(dāng)我們直接new出來的對象就是臨時/瞬時狀態(tài)的..
該對象還沒有被持久化【沒有保存在數(shù)據(jù)庫中】
不受Session的管理
持久化狀態(tài)當(dāng)保存在數(shù)據(jù)庫中的對象就是持久化狀態(tài)了
當(dāng)調(diào)用session的save/saveOrUpdate/get/load/list等方法的時候,對象就是持久化狀態(tài)
在數(shù)據(jù)庫有對應(yīng)的數(shù)據(jù)
受Session的管理
當(dāng)對對象屬性進行更改的時候,會反映到數(shù)據(jù)庫中!
我們來測試一下:當(dāng)對對象屬性進行更改的時候,會反映到數(shù)據(jù)庫中!
session.save(idCard); idCard.setIdCardName("我是測試持久化對象");游離狀態(tài)
當(dāng)Session關(guān)閉了以后,持久化的對象就變成了游離狀態(tài)了...
不處于session的管理
數(shù)據(jù)庫中有對應(yīng)的記錄
有了上面的基礎(chǔ),我們就很容易說出它們之間的轉(zhuǎn)換了
new出來的對象是瞬時狀態(tài)->保存到數(shù)據(jù)庫中(受Session管理)就是持久化狀態(tài)->將session close掉就是游離狀態(tài)
比較hibernate的三種檢索策略優(yōu)缺點比較hibernate的三種檢索策略優(yōu)缺點
立即檢索:
優(yōu)點: 對應(yīng)用程序完全透明,不管對象處于持久化狀態(tài),還是游離狀態(tài),應(yīng)用程序都可以方便的從一個對象導(dǎo)航到與它關(guān)聯(lián)的對象;
缺點: 1.select語句太多;2.可能會加載應(yīng)用程序不需要訪問的對象白白浪費許多內(nèi)存空間;
立即檢索:lazy=false;
延遲檢索:
優(yōu)點: 由應(yīng)用程序決定需要加載哪些對象,可以避免可執(zhí)行多余的select語句,以及避免加載應(yīng)用程序不需要訪問的對象。因此能提高檢索性能,并且能節(jié)省內(nèi)存空間;
缺點: 應(yīng)用程序如果希望訪問游離狀態(tài)代理類實例,必須保證他在持久化狀態(tài)時已經(jīng)被初始化;
延遲加載:lazy=true;
迫切左外連接檢索:
優(yōu)點: 1對應(yīng)用程序完全透明,不管對象處于持久化狀態(tài),還是游離狀態(tài),應(yīng)用程序都可以方便地沖一個對象導(dǎo)航到與它關(guān)聯(lián)的對象。2使用了外連接,select語句數(shù)目少;
缺點: 1 可能會加載應(yīng)用程序不需要訪問的對象,白白浪費許多內(nèi)存空間;2復(fù)雜的數(shù)據(jù)庫表連接也會影響檢索性能;
預(yù)先抓取: fetch=“join”;
hibernate都支持哪些緩存策略hibernate都支持哪些緩存策略
usage的屬性有4種:
放入二級緩存的對象,只讀(Read-only);
非嚴(yán)格的讀寫(Nonstrict read/write)
讀寫; 放入二級緩存的對象可以讀、寫(Read/write);
基于事務(wù)的策略(Transactional)
hibernate里面的sorted collection 和ordered collection有什么區(qū)別hibernate里面的sorted collection 和ordered collection有什么區(qū)別
sorted collection
是在內(nèi)存中通過Java比較器進行排序的
ordered collection
是在數(shù)據(jù)庫中通過order by進行排序的
對于比較大的數(shù)據(jù)集,為了避免在內(nèi)存中對它們進行排序而出現(xiàn) Java中的OutOfMemoryError,最好使用ordered collection。
說下Hibernate的緩存機制說下Hibernate的緩存機制
一級緩存:
Hibenate中一級緩存,也叫做session的緩存,它可以在session范圍內(nèi)減少數(shù)據(jù)庫的訪問次數(shù)! 只在session范圍有效! Session關(guān)閉,一級緩存失效!
只要是持久化對象狀態(tài)的,都受Session管理,也就是說,都會在Session緩存中!
Session的緩存由hibernate維護,用戶不能操作緩存內(nèi)容; 如果想操作緩存內(nèi)容,必須通過hibernate提供的evit/clear方法操作。
二級緩存:
二級緩存是基于應(yīng)用程序的緩存,所有的Session都可以使用
Hibernate提供的二級緩存有默認(rèn)的實現(xiàn),且是一種可插配的緩存框架!如果用戶想用二級緩存,只需要在hibernate.cfg.xml中配置即可; 不想用,直接移除,不影響代碼。
如果用戶覺得hibernate提供的框架框架不好用,自己可以換其他的緩存框架或自己實現(xiàn)緩存框架都可以。
Hibernate二級緩存:存儲的是常用的類
Hibernate的查詢方式有幾種Hibernate的查詢方式有幾種
對象導(dǎo)航查詢(objectcomposition)
HQL查詢
1、 屬性查詢
2、 參數(shù)查詢、命名參數(shù)查詢
3、 關(guān)聯(lián)查詢
4、 分頁查詢
5、 統(tǒng)計函數(shù)
Criteria 查詢
SQLQuery本地SQL查詢
如何優(yōu)化Hibernate?如何優(yōu)化Hibernate?
? 數(shù)據(jù)庫設(shè)計調(diào)整
? HQL優(yōu)化
? API的正確使用(如根據(jù)不同的業(yè)務(wù)類型選用不同的集合及查詢API)
? 主配置參數(shù)(日志,查詢緩存,fetch_size, batch_size等)
? 映射文件優(yōu)化(ID生成策略,二級緩存,延遲加載,關(guān)聯(lián)優(yōu)化)
? 一級緩存的管理
? 針對二級緩存,還有許多特有的策略
詳情可參考資料:
https://www.cnblogs.com/xhj123/p/6106088.html
談?wù)凥ibernate中inverse的作用談?wù)凥ibernate中inverse的作用
inverse屬性默認(rèn)是false,就是說關(guān)系的兩端都來維護關(guān)系。
比如Student和Teacher是多對多關(guān)系,用一個中間表TeacherStudent維護。Gp)
如果Student這邊inverse=”true”, 那么關(guān)系由另一端Teacher維護,就是說當(dāng)插入Student時,不會操作TeacherStudent表(中間表)。只有Teacher插入或刪除時才會觸發(fā)對中間表的操作。所以兩邊都inverse=”true”是不對的,會導(dǎo)致任何操作都不觸發(fā)對中間表的影響;當(dāng)兩邊都inverse=”false”或默認(rèn)時,會導(dǎo)致在中間表中插入兩次關(guān)系。
如果表之間的關(guān)聯(lián)關(guān)系是“一對多”的話,那么inverse只能在“一”的一方來配置!
詳情可參考:
https://zhongfucheng.bitcron.com/post/hibernate/hibernate-inversehe-cascadeshu-xing-zhi-shi-yao-dian
JDBC hibernate 和 ibatis 的區(qū)別JDBC hibernate 和 ibatis 的區(qū)別jdbc:手動
手動寫sql
delete、insert、update要將對象的值一個一個取出傳到sql中,不能直接傳入一個對象。
select:返回的是一個resultset,要從ResultSet中一行一行、一個字段一個字段的取出,然后封裝到一個對象中,不直接返回一個對象。
ibatis的特點:半自動化sql要手動寫
delete、insert、update:直接傳入一個對象
select:直接返回一個對象
hibernate:全自動不寫sql,自動封裝
delete、insert、update:直接傳入一個對象
select:直接返回一個對象
在數(shù)據(jù)庫中條件查詢速度很慢的時候,如何優(yōu)化?在數(shù)據(jù)庫中條件查詢速度很慢的時候,如何優(yōu)化?
建索引
減少表之間的關(guān)聯(lián)
優(yōu)化sql,盡量讓sql很快定位數(shù)據(jù),不要讓sql做全表查詢,應(yīng)該走索引,把數(shù)據(jù)量大的表排在前面
簡化查詢字段,沒用的字段不要,已經(jīng)對返回結(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ù)存儲和線程安全的,以至于可以多線程同時訪問。一個SessionFactory 在啟動的時候只能建立一次。SessionFactory應(yīng)該包裝各種單例以至于它能很簡單的在一個應(yīng)用代碼中儲存.
get和load區(qū)別get和load區(qū)別
get()立即查詢
load()懶加載
1)get如果沒有找到會返回null, load如果沒有找到會拋出異常。
2)get會先查一級緩存, 再查二級緩存,然后查數(shù)據(jù)庫;load會先查一級緩存,如果沒有找到,就創(chuàng)建代理對象, 等需要的時候去查詢二級緩存和數(shù)據(jù)庫。
merge的含義:merge的含義:
如果session中存在相同持久化標(biāo)識(identifier)的實例,用用戶給出的對象的狀態(tài)覆蓋舊有的持久實例
如果session沒有相應(yīng)的持久實例,則嘗試從數(shù)據(jù)庫中加載,或創(chuàng)建新的持久化實例,最后返回該持久實例
用戶給出的這個對象沒有被關(guān)聯(lián)到session上,它依舊是脫管的
詳情可參考:
http://cp3.iteye.com/blog/786019
persist和save的區(qū)別persist和save的區(qū)別
persist不保證立即執(zhí)行,可能要等到flush;
persist不更新緩存;
save, 把一個瞬態(tài)的實例持久化標(biāo)識符,及時的產(chǎn)生,它要返回標(biāo)識符,所以它會立即執(zhí)行Sql insert
使用 save() 方法保存持久化對象時,該方法返回該持久化對象的標(biāo)識屬性值(即對應(yīng)記錄的主鍵值);
使用 persist() 方法來保存持久化對象時,該方法沒有任何返回值。
參考資料:
http://blog.csdn.net/u010739551/article/details/47253881
主鍵生成 策略有哪些主鍵生成 策略有哪些
主鍵的自動生成策略
identity 自增長(mysql,db2)
sequence 自增長(序列), oracle中自增長是以序列方法實現(xiàn)**
native 自增長【會根據(jù)底層數(shù)據(jù)庫自增長的方式選擇identity或sequence】
如果是mysql數(shù)據(jù)庫, 采用的自增長方式是identity
如果是oracle數(shù)據(jù)庫, 使用sequence序列的方式實現(xiàn)自增長
increment 自增長(會有并發(fā)訪問的問題,一般在服務(wù)器集群環(huán)境使用會存在問題。)
指定主鍵生成策略為手動指定主鍵的值
assigned
指定主鍵生成策略為UUID生成的值
uuid
foreign(外鍵的方式)
簡述hibernate中g(shù)etCurrentSession和openSession區(qū)別簡述hibernate中g(shù)etCurrentSession和openSession區(qū)別
1、getCurrentSession會綁定當(dāng)前線程,而openSession不會,因為我們把hibernate交給我們的spring來管理之后,我們是有事務(wù)配置,這個有事務(wù)的線程就會綁定當(dāng)前的工廠里面的每一個session,而openSession是創(chuàng)建一個新session。
2、getCurrentSession事務(wù)是有spring來控制的,而openSession需要我們手動開啟和手動提交事務(wù),
3、getCurrentSession是不需要我們手動關(guān)閉的,因為工廠會自己管理,而openSession需要我們手動關(guān)閉。
4、而getCurrentSession需要我們手動設(shè)置綁定事務(wù)的機制,有三種設(shè)置方式,jdbc本地的Thread、JTA、第三種是spring提供的事務(wù)管理機制org.springframework.orm.hibernate4.SpringSessionContext,而且srping默認(rèn)使用該種事務(wù)管理機制
Hibernate中的命名SQL查詢指的是什么?Hibernate中的命名SQL查詢指的是什么?
命名查詢指的是用
Hibernate中的命名查詢可以使用注解來定義,也可以使用我前面提到的xml影射問句來定義。在Hibernate中,@NameQuery用來定義單個的命名查詢,@NameQueries用來定義多個命名查詢。
為什么在Hibernate的實體類中要提供一個無參數(shù)的構(gòu)造器這一點非常重要?為什么在Hibernate的實體類中要提供一個無參數(shù)的構(gòu)造器這一點非常重要?
每個Hibernate實體類必須包含一個 無參數(shù)的構(gòu)造器, 這是因為Hibernate框架要使用Reflection API,通過調(diào)用Class.newInstance()來創(chuàng)建這些實體類的實例。如果在實體類中找不到無參數(shù)的構(gòu)造器,這個方法就會拋出一個InstantiationException異常。
可不可以將Hibernate的實體類定義為final類?可不可以將Hibernate的實體類定義為final類?
你可以將Hibernate的實體類定義為final類,但這種做法并不好。因為Hibernate會使用代理模式在延遲關(guān)聯(lián)的情況下提高性能,如果你把實體類定義成final類之后,因為 Java不允許對final類進行擴展,所以Hibernate就無法再使用代理了, 如此一來就限制了使用可以提升性能的手段。
最后參考資料:
http://blog.csdn.net/qq1137623160/article/details/71194677
http://blog.csdn.net/u013842976/article/details/52518218
http://blog.csdn.net/yubotianxiao/article/details/52238200
如果文章有錯的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號:Java3y
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/68734.html
摘要:我在面試前針對基礎(chǔ)也花了不少的時間,期間也將自己寫過的博文粗略地刷了一遍,同時也在網(wǎng)上找了不少比較好的資料部分是沒看完的。看面試題也是校驗自己是否真正理解了這個知識點,也很有可能會有新的收獲。 一、前言 只有光頭才能變強 回顧前面: 廣州三本找Java實習(xí)經(jīng)歷 上一篇寫了自己面試的經(jīng)歷和一些在面試的時候遇到的題目(筆試題和面試題)。 我在面試前針對Java基礎(chǔ)也花了不少的時間,期間也將...
摘要:容器自動完成裝載,默認(rèn)的方式是這部分重點在常用模塊的使用以及的底層實現(xiàn)原理。 對于那些想面試高級 Java 崗位的同學(xué)來說,除了算法屬于比較「天方夜譚」的題目外,剩下針對實際工作的題目就屬于真正的本事了,熱門技術(shù)的細(xì)節(jié)和難點成為了主要考察的內(nèi)容。 這里說「天方夜譚」并不是說算法沒用,不切實際,而是想說算法平時其實很少用到,甚至面試官都對自己出的算法題一知半解。 這里總結(jié)打磨了 70 道...
摘要:執(zhí)行沒有,批處理不支持,將所有都添加到批處理中,等待統(tǒng)一執(zhí)行,它緩存了多個對象,每個對象都是完畢后,等待逐一執(zhí)行批處理。 Mybatis常見面試題 #{}和${}的區(qū)別是什么? #{}和${}的區(qū)別是什么? 在Mybatis中,有兩種占位符 #{}解析傳遞進來的參數(shù)數(shù)據(jù) ${}對傳遞進來的參數(shù)原樣拼接在SQL中 #{}是預(yù)編譯處理,${}是字符串替換。 使用#{}可以有效的防止...
摘要:前言由于寫的文章已經(jīng)是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導(dǎo)航。 前言 由于寫的文章已經(jīng)是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號:Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡單 注解就這么簡單 Druid數(shù)據(jù)庫連接池...
閱讀 6866·2021-09-22 15:36
閱讀 5687·2021-09-02 10:20
閱讀 1869·2019-08-30 15:44
閱讀 2653·2019-08-29 14:06
閱讀 1153·2019-08-29 11:17
閱讀 1585·2019-08-26 14:05
閱讀 3093·2019-08-26 13:50
閱讀 1551·2019-08-26 10:26