113. 為什么要使用 hibernate?
- 對JDBC訪問數(shù)據(jù)庫的代碼做了封裝廷臼,大大簡化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼。
- Hibernate是一個基于JDBC的主流持久化框架饵溅,是一個優(yōu)秀的ORM實現(xiàn)赫冬。他很大程度的簡化DAO層的編碼工作
- hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來實現(xiàn)透明性目木。
- hibernate的性能非常好换途,因為它是個輕量級框架。映射的靈活性很出色刽射。它支持各種關(guān)系數(shù)據(jù)庫军拟,從一對一到多對多的各種復(fù)雜關(guān)系。
114. 什么是 ORM 框架誓禁?**
對象-關(guān)系映射(Object-Relational Mapping懈息,簡稱ORM),面向?qū)ο蟮拈_發(fā)方法是當(dāng)今企業(yè)級應(yīng)用開發(fā)環(huán)境中的主流開發(fā)方法摹恰,關(guān)系數(shù)據(jù)庫是企業(yè)級應(yīng)用環(huán)境中永久存放數(shù)據(jù)的主流數(shù)據(jù)存儲系統(tǒng)辫继。對象和關(guān)系數(shù)據(jù)是業(yè)務(wù)實體的兩種表現(xiàn)形式怒见,業(yè)務(wù)實體在內(nèi)存中表現(xiàn)為對象,在數(shù)據(jù)庫中表現(xiàn)為關(guān)系數(shù)據(jù)姑宽。內(nèi)存中的對象之間存在關(guān)聯(lián)和繼承關(guān)系遣耍,而在數(shù)據(jù)庫中,關(guān)系數(shù)據(jù)無法直接表達(dá)多對多關(guān)聯(lián)和繼承關(guān)系炮车。因此舵变,對象-關(guān)系映射(ORM)系統(tǒng)一般以中間件的形式存在,主要實現(xiàn)程序?qū)ο蟮疥P(guān)系數(shù)據(jù)庫數(shù)據(jù)的映射.
115. hibernate 中如何在控制臺查看打印的 sql 語句
參考:blog.csdn.net/Randy_Wang_/article/details/79460306
116. hibernate 有幾種查詢方式瘦穆?
- hql查詢
- sql查詢
- 條件查詢
hql查詢棋傍,sql查詢,條件查詢
HQL: Hibernate Query Language. 面向?qū)ο蟮膶懛?
Query query = session.createQuery("from Customer where name = ?");
query.setParameter(0, "蒼老師");
Query.list();
QBC: Query By Criteria.(條件查詢)
Criteria criteria = session.createCriteria(Customer.class);
criteria.add(Restrictions.eq("name", "花姐"));
List<Customer> list = criteria.list();
SQL:
SQLQuery query = session.createSQLQuery("select * from customer");
List<Object[]> list = query.list();
SQLQuery query = session.createSQLQuery("select * from customer");
query.addEntity(Customer.class);
List<Customer> list = query.list();
Hql: 具體分類
1难审、 屬性查詢 2瘫拣、 參數(shù)查詢、命名參數(shù)查詢 3告喊、 關(guān)聯(lián)查詢 4麸拄、 分頁查詢 5、 統(tǒng)計函數(shù)
HQL和SQL的區(qū)別
HQL是面向?qū)ο蟛樵儾僮鞯那琒QL是結(jié)構(gòu)化查詢語言 是面向數(shù)據(jù)庫表結(jié)構(gòu)的
117. hibernate 實體類可以被定義為 final 嗎拢切?
可以將Hibernate的實體類定義為final類,但這種做法并不好秆吵。因為Hibernate會使用代理模式在延遲關(guān)聯(lián)的情況下提高性能淮椰,如果你把實體類定義成final類之后,因為 Java不允許對final類進(jìn)行擴(kuò)展纳寂,所以Hibernate就無法再使用代理了主穗,如此一來就限制了使用可以提升性能的手段。不過毙芜,如果你的持久化類實現(xiàn)了一個接口而且在該接口中聲明了所有定義于實體類中的所有public的方法輪到話忽媒,你就能夠避免出現(xiàn)前面所說的不利后果。
118. 在 hibernate 中使用 Integer 和 int 做映射有什么區(qū)別腋粥?
在Hibernate中晦雨,如果將OID定義為Integer類型,那么Hibernate就可以根據(jù)其值是否為null而判斷一個對象是否是臨時的隘冲,如果將OID定義為了int類型闹瞧,還需要在hbm映射文件中設(shè)置其unsaved-value屬性為0。
119. hibernate 是如何工作的展辞?
區(qū)別奥邮?
- load() 沒有使用對象的其他屬性的時候,沒有SQL 延遲加載
- get() 沒有使用對象的其他屬性的時候纵竖,也生成了SQL 立即加載
121. 說一下 hibernate 的緩存機(jī)制漠烧?
Hibernate中的緩存分為一級緩存和二級緩存。
一級緩存就是 Session 級別的緩存靡砌,在事務(wù)范圍內(nèi)有效是,內(nèi)置的不能被卸載已脓。二級緩存是 SesionFactory級別的緩存,從應(yīng)用啟動到應(yīng)用結(jié)束有效通殃。是可選的度液,默認(rèn)沒有二級緩存,需要手動開啟画舌。保存數(shù)據(jù)庫后堕担,緩存在內(nèi)存中保存一份,如果更新了數(shù)據(jù)庫就要同步更新曲聂。
什么樣的數(shù)據(jù)適合存放到第二級緩存中霹购?
擴(kuò)展:hibernate的二級緩存默認(rèn)是不支持分布式緩存的。使用 memcahe,redis等中央緩存來代替二級緩存朋腋。
122. hibernate 對象有哪些狀態(tài)齐疙?
hibernate里對象有三種狀態(tài):
- Transient(瞬時):對象剛new出來,還沒設(shè)id旭咽,設(shè)了其他值贞奋。
- Persistent(持久):調(diào)用了save()、saveOrUpdate()穷绵,就變成Persistent轿塔,有id。
-
etached(脫管):當(dāng)session close()完之后仲墨,變成Detached勾缭。
20190403231622847.png
123. 在 hibernate 中 getCurrentSession 和 openSession 的區(qū)別是什么?
openSession 從字面上可以看得出來目养,是打開一個新的session對象漫拭,而且每次使用都是打開一個新的session,假如連續(xù)使用多次混稽,則獲得的session不是同一個對象采驻,并且使用完需要調(diào)用close方法關(guān)閉session。
getCurrentSession 匈勋,從字面上可以看得出來礼旅,是獲取當(dāng)前上下文一個session對象,當(dāng)?shù)谝淮问褂么朔椒〞r洽洁,會自動產(chǎn)生一個session對象痘系,并且連續(xù)使用多次時,得到的session都是同一個對象饿自,這就是與openSession的區(qū)別之一汰翠,簡單而言澜驮,getCurrentSession 就是:如果有已經(jīng)使用的,用舊的志鹃,如果沒有娄昆,建新的。
注意:在實際開發(fā)中佛纫,往往使用getCurrentSession多妓局,因為一般是處理同一個事務(wù)(即是使用一個數(shù)據(jù)庫的情況),所以在一般情況下比較少使用openSession或者說openSession是比較老舊的一套接口了呈宇。
124hibernate 實體類必須要有無參構(gòu)造函數(shù)嗎好爬?為什么?
必須甥啄,因為hibernate框架會調(diào)用這個默認(rèn)構(gòu)造方法來構(gòu)造實例對象存炮,即Class類的newInstance方法,這個方法就是通過調(diào)用默認(rèn)構(gòu)造方法來創(chuàng)建實例對象的蜈漓。
另外再提醒一點僵蛛,如果你沒有提供任何構(gòu)造方法,虛擬機(jī)會自動提供默認(rèn)構(gòu)造方法(無參構(gòu)造器)迎变,但是如果你提供了其他有參數(shù)的構(gòu)造方法的話充尉,虛擬機(jī)就不再為你提供默認(rèn)構(gòu)造方法,這時必須手動把無參構(gòu)造器寫在代碼里衣形,否則new Xxxx()是會報錯的驼侠,所以默認(rèn)的構(gòu)造方法不是必須的,只在有多個構(gòu)造方法時才是必須的谆吴,這里“必須”指的是“必須手動寫出來”倒源。