hibernate 复合主键 根据主键删除_6道常见的 Hibernate 面试题
1、Hibernate的理解
Java的核心之一是面向?qū)ο笤O(shè)計,那么如何把數(shù)據(jù)庫的數(shù)據(jù)封裝成一個對象返回呢?如何把一個對象出局后保存到數(shù)據(jù)庫呢?Java采用了jdbc來解決這個問題,但是數(shù)據(jù)量如何解決,也沒有標(biāo)準(zhǔn)的模板來解決呢?這就是Hibernate的功能之一了。
Hibernate實現(xiàn)了Java對象與關(guān)系數(shù)據(jù)庫記錄的映射關(guān)系,簡稱ORM,像mybatis、jpa也是一種ORM框架。有了Hibernate,我們就不需要寫jdbc代碼了,直接調(diào)用hibernate的方法就可以了,比如save、get。對 JDBC 訪問數(shù)據(jù)庫的代碼做了封裝,簡化了數(shù)據(jù)訪問層繁瑣的重復(fù)。
2、Hibernate運行過程和原理
簡單運行過程如下:
配置Configuration 、產(chǎn)生SessionFactory、創(chuàng)建session對象、啟動事務(wù)、完成CURD、提交事務(wù)、關(guān)閉session。
所以核心是:Configuration、SessionFactory、Session
1、hibernate啟動的時候利用Configuration讀取xml配置文件
2、通過配置文件創(chuàng)建SessionFactory對象,初始化hibernate基本信息
3、獲取session然后調(diào)用CRUD方法進(jìn)行數(shù)據(jù)操作,hibernate會把我們的數(shù)據(jù)進(jìn)行三種狀態(tài)的劃分,然后根據(jù)狀態(tài)進(jìn)行管理我們的數(shù)據(jù),對應(yīng)的發(fā)送SQL進(jìn)行數(shù)據(jù)操作
4、關(guān)閉session,如果有事務(wù)的情況下,需要手動獲取事務(wù)并開啟,然后事務(wù)結(jié)束后提交事務(wù)。
5、在提交事務(wù)的時候,去驗證我們的快照里面的數(shù)據(jù)和緩存數(shù)據(jù)是否一致,如果不一致,發(fā)送SQL進(jìn)行修改。
3、Hibernate的數(shù)據(jù)三種狀態(tài)
Hibernate把他所管理的數(shù)據(jù)劃分為三種狀態(tài) 瞬時的(剛new出來的數(shù)據(jù)–內(nèi)存有,數(shù)據(jù)庫沒有) 不和數(shù)據(jù)庫的數(shù)據(jù)有任何關(guān)聯(lián)關(guān)系,在Hibernate中,可通過session的save()或 saveOrUpdate()方法將瞬時對象與數(shù)據(jù)庫相關(guān)聯(lián),并將數(shù)據(jù)對應(yīng)的插入數(shù)據(jù)庫中,此時該瞬時對象轉(zhuǎn)變成持久化對象.
持久的 (從數(shù)據(jù)查詢的,或者剛保存到數(shù)據(jù)庫,session沒關(guān)閉的, 數(shù)據(jù)庫有,內(nèi)存也有) 處于該狀態(tài)的對象在數(shù)據(jù)庫中具有對應(yīng)的記錄,并擁有一個持久化標(biāo)識。如果是用hibernate的delete()方法,對應(yīng)的持久對象就變成瞬時對象,因數(shù)據(jù)庫中的對應(yīng)數(shù)據(jù)已被刪除,該對象不再與數(shù)據(jù)庫的記錄關(guān)聯(lián)。
當(dāng)一個session執(zhí)行close()或clear()、evict()之后,持久對象變成脫管對象,此時持久對象會變成脫管對象,此時該對象雖然具有數(shù)據(jù)庫識別值,但它已不在HIbernate持久層的管理之下。
游離的 (數(shù)據(jù)庫有,內(nèi)存沒有) 當(dāng)與某持久對象關(guān)聯(lián)的session被關(guān)閉后,該持久對象轉(zhuǎn)變?yōu)槊摴軐ο蟆.?dāng)脫管對象被重新關(guān)聯(lián)到session上時,并再次轉(zhuǎn)變成持久對象。
在事務(wù)提交的時候,Hibernate去對比處于持久狀態(tài)的數(shù)據(jù)是否發(fā)生改變,(快照區(qū)、一級緩存區(qū)),當(dāng)我們會話結(jié)束前,對持久狀態(tài)數(shù)據(jù)進(jìn)行了修改的話,快照區(qū)的數(shù)據(jù)會跟著改變。當(dāng)session提交事務(wù)的時候,如果發(fā)現(xiàn)快照區(qū)和一級緩存的數(shù)據(jù)不一致,就會發(fā)送SQL進(jìn)行修改。
4、Hibernate的get方法和load方法的區(qū)別
1、get和load都是利用主鍵策略查詢數(shù)據(jù),
2、get默認(rèn)不使用懶加載機(jī)制,load默認(rèn)要使用懶加載機(jī)制,所謂的懶加載就是我們這個數(shù)據(jù)如果不使用,hibernate就不發(fā)送SQL到數(shù)據(jù)庫查詢數(shù)據(jù)。
3、當(dāng)查詢數(shù)據(jù)庫不存在的數(shù)據(jù)的時候,get方法返回null,load方法拋出空指針異常,
原因是因為,load方法采用的動態(tài)代理的方式實現(xiàn)的,我們使用load方法的時候,Hibernate會創(chuàng)建一個該實體的代理對象,該代理只保存了該對象的ID,當(dāng)我們訪問該實體對象其他屬性,Hibernate就發(fā)送SQL查詢數(shù)據(jù)封裝到代理對象,然后在利用代理對象返回給我們實際的數(shù)據(jù)。
5、Hibernate的緩存機(jī)制
hibernate分為2級緩存
一級緩存又叫session緩存,又叫事務(wù)級緩存,生命周期從事務(wù)開始到事務(wù)結(jié)束,一級緩存是hibernate自帶的,暴力使用,當(dāng)我們一創(chuàng)建session就已有這個緩存了。數(shù)據(jù)庫就會自動往緩存存放,
二級緩存是hibernate提供的一組開放的接口方式實現(xiàn)的,都是通過整合第三方的緩存框架來實現(xiàn)的,二級緩存又叫sessionFactory的緩存,可以跨session訪問。常用的EHcache、OScache,這個需要一些配置。
當(dāng)我們每次 查詢數(shù)據(jù)的時候,首先是到一級緩存查看是否存在該對象,如果有直接返回,如果沒有就去二級緩存進(jìn)行查看,如果有直接返回,如果沒有在發(fā)送SQL到數(shù)據(jù)庫查詢數(shù)據(jù),
當(dāng)SQL發(fā)送查詢回該數(shù)據(jù)的時候,hibernate會把該對象以主鍵為標(biāo)記的形式存儲到二級緩存和一級緩存,如果返回的是集合,會把集合打散然后以主鍵的形式存儲到緩存。一級緩存和二級緩存只針對以ID查詢的方式生效,get、load方法。
6、Hibernate有哪幾種查詢數(shù)據(jù)的方式
3種
hql、
條件查詢QBC(Query By Criteria)
原生sql (通過createSQLQuery建立)
--end--
總結(jié)
以上是生活随笔為你收集整理的hibernate 复合主键 根据主键删除_6道常见的 Hibernate 面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: homeassistant树莓派cpu_
- 下一篇: python double语法_pyth