Java面試題——hibernate面試題及答案

Java面試題——hibernate面試題及答案

長沙達(dá)內(nèi)教育      2022-04-10 07:49:01     1

Java面試題——hibernate面試題及答案,  1、cascade關(guān)系有以下幾種  (1)all: 所有情況下均進(jìn)行關(guān)聯(lián)操作,即save-update和delete ?。?)0none: 所有情況下均

課程價(jià)格 請咨詢

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹

  


1、cascade關(guān)系有以下幾種

 

       (1)all: 所有情況下均進(jìn)行關(guān)聯(lián)操作,即save-update和delete


 ?。?)0none: 所有情況下均不進(jìn)行關(guān)聯(lián)操作。這是默認(rèn)值


 ?。?)save-update: 在執(zhí)行save/update/saveOrUpdate時(shí)進(jìn)行關(guān)聯(lián)操作


 ?。?)0delete: 在執(zhí)行delete 時(shí)進(jìn)行關(guān)聯(lián)操作


 ?。?)all-delete-orphan: 當(dāng)一個(gè)節(jié)點(diǎn)在對象圖中成為孤兒節(jié)點(diǎn)時(shí),刪除該節(jié)點(diǎn)



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


     (1)Hibernate的get方法,會(huì)確認(rèn)一下該id對應(yīng)的數(shù)據(jù)是否存在,首先在session緩存中查找然后在二級(jí)緩存中查找,還沒有就查詢數(shù)據(jù)庫,數(shù)據(jù)庫中沒有就返回null


     (2)Hibernate的load方法加載實(shí)體對象的時(shí)候,根據(jù)映射文件上類級(jí)別的lazy屬性的配置(默認(rèn)為true):


   1)若為true,則首先在Session緩存中查找,看看該id對應(yīng)的對象是否存在,不存在則使用延遲加載


   返回實(shí)體的代理類對象(該代理類為實(shí)體類的子類,由CGLIB動(dòng)態(tài)生成)。等到具體使用該對象(除獲取OID以外)的時(shí)候


   再查詢二級(jí)緩存和數(shù)據(jù)庫,若仍沒發(fā)現(xiàn)符合條件的記錄,則會(huì)拋出一個(gè)ObjectNotFoundException


   2)若為false,就跟Hibernate的get方法查找順序一樣,只是最終若沒發(fā)現(xiàn)符合條件的記錄


   則會(huì)拋出一個(gè)ObjectNotFoundException,所說的load方法拋異常是指在使用該對象的數(shù)據(jù)時(shí)


   數(shù)據(jù)庫中不存在該數(shù)據(jù)時(shí)拋異常,而不是在創(chuàng)建這個(gè)對象時(shí)



3、Hibernate 的緩存體系


  (1)一級(jí)緩存: Session 有一個(gè)內(nèi)置的緩存,其中存放了被當(dāng)前工作單元加載的對象,每個(gè)Session 都有自己獨(dú)立的緩存,且只能被當(dāng)前工作單元訪問


 ?。?)二級(jí)緩存: SessionFactory的外置的可插拔的緩存插件。其中的數(shù)據(jù)可被多個(gè)Session共享訪問SessionFactory的內(nèi)置緩存:存放了映射元數(shù)據(jù),預(yù)定義的Sql語句



4、Hibernate 中Java對象的狀態(tài)


  (1)臨時(shí)狀態(tài)(transient)特征:不處于Session 緩存中,數(shù)據(jù)庫中沒有對象記錄,


Java如何進(jìn)入臨時(shí)狀態(tài)


通過new語句剛創(chuàng)建一個(gè)對象時(shí)


當(dāng)調(diào)用Session 的delete()方法


從Session 緩存中刪除一個(gè)對象時(shí)


(2)持久化狀態(tài)(persisted)特征:處于Session 緩存中,持久化對象數(shù)據(jù)庫中設(shè)有對象記錄,Session 在特定時(shí)刻會(huì)保持二者同步


  Java如何進(jìn)入持久化狀態(tài)


  Session 的save()把臨時(shí)-》持久化狀態(tài)


  Session 的load(),get()方法返回的對象


  Session 的find()返回的list集合中存放的對象


  Session 的update(),saveOrupdate()使游離-》持久化


 ?。?)游離狀態(tài)(detached)特征:不再位于Session 緩存中,游離對象由持久化狀態(tài)轉(zhuǎn)變而來,數(shù)據(jù)庫中可能還有對應(yīng)記錄


  Java如何進(jìn)入持久化狀態(tài)-》游離狀態(tài)


  Session 的close()方法


  Session 的evict()方法,從緩存中刪除一個(gè)對象



5、數(shù)據(jù)庫事務(wù)并發(fā)可能帶來的問題


(1)第一類丟失更新(lost update): 在完全未隔離事務(wù)的情況下,兩個(gè)事物更新同一條數(shù)據(jù)資源某一事物異常終止,回滾造成第一個(gè)完成的更新也同時(shí)丟失。


(2)臟讀(dirty read):如果第二個(gè)事務(wù)查詢到第一個(gè)事務(wù)還未提交的更新數(shù)據(jù),形成臟讀


(3)不可重復(fù)讀(unrepeated read):一個(gè)事務(wù)兩次讀取同一行數(shù)據(jù),結(jié)果得到不同狀態(tài)結(jié)果如中間正好另一個(gè)事務(wù)更新了該數(shù)據(jù),兩次結(jié)果相異,不可信任


(4) 第二類丟失更新(second lost updates):是不可重復(fù)讀的特殊情況,如果兩個(gè)事務(wù)都讀取同一行,然后兩個(gè)都進(jìn)行寫操作,并提交,第一個(gè)事務(wù)所做的改變就會(huì)丟失



6、Hibernate中save、update和saveOrUpdate方法的不同之處


 ?。?)save:執(zhí)行保存操作的,對一個(gè)新new出來的對象進(jìn)行保存,數(shù)據(jù)庫中沒有這個(gè)對象,如果數(shù)據(jù)庫中有,會(huì)報(bào)錯(cuò)說有重復(fù)的記錄


     (2)update:如果是對一個(gè)已經(jīng)存在的托管對象進(jìn)行更新,要使用update方法了,數(shù)據(jù)中有這個(gè)對象


     (3)saveOrUpdate:這個(gè)方法是更新或者插入,有主鍵就執(zhí)行更新,如果沒有主鍵就執(zhí)行插入。是根據(jù)實(shí)體類對象的狀態(tài)做的不同操作


  1)實(shí)體類對象為臨時(shí)態(tài)時(shí)做的添加save操作


  實(shí)體類對象為游離態(tài)、持久態(tài)時(shí)做的修改update操作



7、Hibernate中save、update和saveOrUpdate方法的不同之處


 ?。?)save:執(zhí)行保存操作的,對一個(gè)新new出來的對象進(jìn)行保存,數(shù)據(jù)庫中沒有這個(gè)對象,如果數(shù)據(jù)庫中有,會(huì)報(bào)錯(cuò)說有重復(fù)的記錄


  (2)0update:如果是對一個(gè)已經(jīng)存在的托管對象進(jìn)行更新,要使用update方法了,數(shù)據(jù)中有這個(gè)對象


 ?。?)0saveOrUpdate:這個(gè)方法是更新或者插入,有主鍵就執(zhí)行更新,如果沒有主鍵就執(zhí)行插入。是根據(jù)實(shí)體類對象的狀態(tài)做的不同操作


  1)實(shí)體類對象為臨時(shí)態(tài)時(shí)做的添加save操作


  2)實(shí)體類對象為游離態(tài)、持久態(tài)時(shí)做的修改update操作



8、hibernate六大接口


(1)Configuration接口:負(fù)責(zé)配置并啟動(dòng)Hibernate


(2)SessionFactory接口:負(fù)責(zé)初始化Hibernate


(3)Session接口:負(fù)責(zé)持久化對象的CRUD操作


(4)Transaction接口:負(fù)責(zé)事務(wù)


(5)Query接口和Criteria接口:負(fù)責(zé)執(zhí)行各種數(shù)據(jù)庫查詢



9、Hibernate悲觀鎖解決事務(wù)并發(fā)問題


  一個(gè)典型的依賴數(shù)據(jù)庫的悲觀鎖調(diào)用:select * from account where name="Erica" for update這條sql語句鎖定了account表中所有符合檢索條件name=Erica的記錄



10、為了解決數(shù)據(jù)庫事務(wù)并發(fā)運(yùn)行時(shí)的各種問題數(shù)據(jù)庫系統(tǒng)提供四種事務(wù)隔離級(jí)


 ?。?)Serializable 串行化


 ?。?)Repeatable Read 可重復(fù)讀


 ?。?)Read Commited 可讀已提交


 ?。?)Read Uncommited 可讀未提交



11、hibernate處理過程


  (1)通過Configuration config = new Configuration().configure();//讀取并解析hibernate.cfg.xml配置文件

  

(2)由hibernate.cfg.xml中的讀取并解析映射信息


(3)通過SessionFactory sf = config.buildSessionFactory();//創(chuàng)建SessionFactory


(4)Session session = sf.openSession();//打開Sesssion


(5)Transaction tx = session.beginTransaction();//創(chuàng)建并啟動(dòng)事務(wù)Transation


(6)persistent operate操作數(shù)據(jù),持久化操作


(7)tx.commit();//提交事務(wù)


(8)session.close();關(guān)閉Session


(9)sf.close()關(guān)閉SesstionFactory



12、事務(wù)的特性


  (1)原子性(atomic),事務(wù)必須是原子工作單元;對于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行


 ?。?)一致性(consistent),事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致狀態(tài)


 ?。?)隔離性(insulation),由并發(fā)事務(wù)所作的修改必須與任何其它并發(fā)事務(wù)所作的修改隔離


  (4)持久性(Duration),事務(wù)完成之后,它對于系統(tǒng)的影響是永久性的



13、什么是懶加載


  (1)Lazy:延遲加載,在真正使用某個(gè)對象的時(shí)候才正真的去創(chuàng)建,即hibernate才會(huì)正真的發(fā)出sql語句去加載該對象


 ?。?)Lazy的有效期:只有在session打開的時(shí)候才有效;session關(guān)閉后lazy就沒效了


   lazy策略可以用在:


  1)標(biāo)簽上:可以取值true/false


  2)標(biāo)簽上,可以取值true/false,這個(gè)特性需要類增強(qiáng)



14、Hibernate 中inverse的屬性


  hibernate配置文件中有這么一個(gè)屬性inverse,它是用來指定關(guān)聯(lián)的控制方的inverse屬性默認(rèn)是false,若為false,則關(guān)聯(lián)由自己控制,若為true,則關(guān)聯(lián)



  15、Hibernate為樂觀鎖提供了3中實(shí)現(xiàn)


 ?。?)基于version


 ?。?)基于timestamp


  (3)為遺留項(xiàng)目添加添加樂觀鎖


Java面試題 Java面試題及答案

培訓(xùn)啦提醒您:交易時(shí)請核實(shí)對方資質(zhì),對于過大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。