日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate面试题分析

發(fā)布時(shí)間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate面试题分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Hibernate面試題分析

1. Hibernate 的檢索方式有哪些 ?
① 導(dǎo)航對象圖檢索?
② OID檢索?
③ HQL檢索?
④ QBC檢索?
⑤ 本地SQL檢索

2. 在 Hibernate 中 Java 對象的狀態(tài)有哪些?
①. 臨時(shí)狀態(tài)(transient):不處于 Session 的緩存中。OID 為null 或等于 id 的 unsaved-value 屬性值
②. 持久化狀態(tài)(persistent):加入到 Session 的緩存中。
③. 游離狀態(tài)(detached):已經(jīng)被持久化,但不再處于 Session 的緩存中。

3.Session的清理和清空有什么區(qū)別?
清理緩存調(diào)用的是 session.flush() 方法. 而清空調(diào)用的是 session.clear() 方法.
Session 清理緩存是指按照緩存中對象的狀態(tài)的變化來同步更新數(shù)據(jù)庫,但不清空緩存;清空是把Session 的緩存置空, 但不同步更新數(shù)據(jù)庫;

4.load()和get()的區(qū)別?
①:如果數(shù)據(jù)庫中,沒有 OID 指定的對象。通過 get方法加載,則返回的是一個(gè)null;通過load加載,則返回一個(gè)代理對象,如果后面代碼如果調(diào)用對象的某個(gè)屬性會(huì)拋出異常:org.hibernate.ObjectNotFoundException;
②:load 支持延遲加載,get不支持延遲加載。

5.hibernate 優(yōu)缺點(diǎn)
①. 優(yōu)點(diǎn):
>對 JDBC 訪問數(shù)據(jù)庫的代碼做了封裝,簡化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼
>映射的靈活性, 它支持各種關(guān)系數(shù)據(jù)庫, 從一對一到多對多的各種復(fù)雜關(guān)系.
>非侵入性、移植性會(huì)好
>緩存機(jī)制: 提供一級(jí)緩存和二級(jí)緩存

②. 缺點(diǎn):
>無法對 SQL 進(jìn)行優(yōu)化
>框架中使用 ORM原則, 導(dǎo)致配置過于復(fù)雜?
>執(zhí)行效率和原生的JDBC 相比偏差: 特別是在批量數(shù)據(jù)處理的時(shí)候
>不支持批量修改、刪除

6. 描述使用 Hibernate 進(jìn)行大批量更新的經(jīng)驗(yàn).
直接通過 JDBC API 執(zhí)行相關(guān)的 SQl 語句或調(diào)用相關(guān)的存儲(chǔ)過程是最佳的方式

7.Hibernate 的OpenSessionView 問題
①. 用于解決懶加載異常, 主要功能就是把 Hibernate Session 和一個(gè)請求的線程綁定在一起, 直到頁面完整輸出, 這樣就可以保證頁面讀取數(shù)據(jù)的時(shí)候 Session 一直是開啟的狀態(tài), 如果去獲取延遲加載對象也不會(huì)報(bào)錯(cuò)。
②. 問題: 如果在業(yè)務(wù)處理階段大批量處理數(shù)據(jù), 有可能導(dǎo)致一級(jí)緩存里的對象占用內(nèi)存過多導(dǎo)致內(nèi)存溢出, 另外一個(gè)是連接問題: Session 和數(shù)據(jù)庫 Connection 是綁定在一起的, 如果業(yè)務(wù)處理緩慢也會(huì)導(dǎo)致數(shù)據(jù)庫連接得不到及時(shí)的釋放, 造成連接池連接不夠. 所以在并發(fā)量較大的項(xiàng)目中不建議使用此種方式, 可以考慮使用迫切左外連接 (LEFT OUTER JOIN FETCH) 或手工對關(guān)聯(lián)的對象進(jìn)行初始化.
③. 配置 Filter 的時(shí)候要放在 Struts2 過濾器的前面, 因?yàn)樗撁嫱耆@示完后再退出.

8.Hibernate 中g(shù)etCurrentSession() 和 openSession() 的區(qū)別 ?
①. getCurrentSession() 它會(huì)先查看當(dāng)前線程中是否綁定了 Session, 如果有則直接返回, 如果沒有再創(chuàng)建. 而openSession() 則是直接 new 一個(gè)新的 Session 并返回。
②. 使用ThreadLocal 來實(shí)現(xiàn)線程 Session 的隔離。
③. getCurrentSession() 在事務(wù)提交的時(shí)候會(huì)自動(dòng)關(guān)閉 Session, 而 openSession() 需要手動(dòng)關(guān)閉.

9.如何調(diào)用原生 SQL ?
調(diào)用 Session 的doWork() 方法.

10.說說 Hibernate 的緩存:
Hibernate緩存包括兩大類:Hibernate一級(jí)緩存和Hibernate二級(jí)緩存:
1). Hibernate一級(jí)緩存又稱為“Session的緩存”,它是內(nèi)置的,不能被卸載。由于Session對象的生命周期通常對應(yīng)一個(gè)數(shù)據(jù)庫事務(wù)或者一個(gè)應(yīng)用事務(wù),因此它的緩存是事務(wù)范圍的緩存。在第一級(jí)緩存中,持久化類的每個(gè)實(shí)例都具有唯一的OID。
2).Hibernate二級(jí)緩存又稱為“SessionFactory的緩存”,由于SessionFactory對象的生命周期和應(yīng)用程序的整個(gè)過程對應(yīng),因此Hibernate二級(jí)緩存是進(jìn)程范圍或者集群范圍的緩存,有可能出現(xiàn)并發(fā)問題,因此需要采用適當(dāng)?shù)牟l(fā)訪問策略,該策略為被緩存的數(shù)據(jù)提供了事務(wù)隔離級(jí)別。第二級(jí)緩存是可選的,是一個(gè)可配置的插件,在默認(rèn)情況下,SessionFactory不會(huì)啟用這個(gè)插件。
當(dāng)Hibernate根據(jù)ID訪問數(shù)據(jù)對象的時(shí)候,首先從Session一級(jí)緩存中查;查不到,如果配置了二級(jí)緩存,那么從二級(jí)緩存中查;如果都查不到,再查詢數(shù)據(jù)庫,把結(jié)果按照ID放入到緩存刪除、更新、增加數(shù)據(jù)的時(shí)候,同時(shí)更新緩存。

轉(zhuǎn)載于:https://www.cnblogs.com/wzk7939/p/6429095.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Hibernate面试题分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。