Hibernate原理及應(yīng)用
Hibernate工作原理及為什么要用?
原理:
1.通過(guò)Configuration().configure();讀取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>讀取并解析映射信息
3.通過(guò)config.buildSessionFactory();//創(chuàng)建SessionFactory
4.sessionFactory.openSession();//打開(kāi)Sesssion
5.session.beginTransaction();//創(chuàng)建事務(wù)Transation
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事務(wù)
8.關(guān)閉Session
9.關(guān)閉SesstionFactory
為什么要用:
1. 對(duì)JDBC訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的代碼做了封裝,大大簡(jiǎn)化了數(shù)據(jù)訪(fǎng)問(wèn)層繁瑣的重復(fù)性代碼。
2. Hibernate是一個(gè)基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的ORM實(shí)現(xiàn)。他很大程度的簡(jiǎn)化DAO層的編碼工作
3. hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來(lái)實(shí)現(xiàn)透明性。
4. hibernate的性能非常好,因?yàn)樗莻€(gè)輕量級(jí)框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。
2. Hibernate是如何延遲加載?
1. Hibernate2延遲加載實(shí)現(xiàn):a)實(shí)體對(duì)象 b)集合(Collection)
2. Hibernate3 提供了屬性的延遲加載功能
當(dāng)Hibernate在查詢(xún)數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒(méi)有存在與內(nèi)存中,當(dāng)程序真正對(duì)數(shù)據(jù)的操作時(shí),對(duì)象才存在與內(nèi)存中,就實(shí)現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開(kāi)銷(xiāo),從而提高了服務(wù)器的性能。
3.Hibernate中怎樣實(shí)現(xiàn)類(lèi)之間的關(guān)系?(如:一對(duì)多、多對(duì)多的關(guān)系)
類(lèi)與類(lèi)之間的關(guān)系主要體現(xiàn)在表與表之間的關(guān)系進(jìn)行操作,它們都市對(duì)對(duì)象進(jìn)行操作,我們程序中把所有的表與類(lèi)都映射在一起,它們通過(guò)配置文件中的many-to-one、one-to-many、many-to-many、
4. 說(shuō)下Hibernate的緩存機(jī)制
1. 內(nèi)部緩存存在Hibernate中又叫一級(jí)緩存,屬于應(yīng)用事物級(jí)緩存
2. 二級(jí)緩存:
a) 應(yīng)用及緩存
b) 分布式緩存
條件:數(shù)據(jù)不會(huì)被第三方修改、數(shù)據(jù)大小在可接受范圍、數(shù)據(jù)更新頻率低、同一數(shù)據(jù)被系統(tǒng)頻繁使用、非 關(guān)鍵數(shù)據(jù)
c) 第三方緩存的實(shí)現(xiàn)
一級(jí)緩存:session級(jí)的緩存也叫事務(wù)級(jí)的緩存,只緩存實(shí)體,生命周期和session一致。不能對(duì)其進(jìn)行管理。
不用顯示的調(diào)用。
二級(jí)緩存:sessionFactory緩存,也叫進(jìn)程級(jí)的緩存,使用第3方插件實(shí)現(xiàn)的,也值緩存實(shí)體,生命周期和sessionFactory一致,可以進(jìn)行管理。
首先配置第3放插件,我們用的是EHCache,在hibernate.cfg.xml文件中加入
<property name="hibernate.cache.user_second_level_cache">true</property>
在映射中也要顯示的調(diào)用,<cache usage="read-only"/>
二級(jí)緩存之查詢(xún)緩存:對(duì)普通屬性進(jìn)行緩存。如果關(guān)聯(lián)的表發(fā)生了修改,那么查詢(xún)緩存的生命周期也結(jié)束了。
在程序中必須手動(dòng)啟用查詢(xún)緩存:query.setCacheable(true);/////////
5. Hibernate的查詢(xún)方式
Sql、Criteria,object comptosition
Hql:
1、 屬性查詢(xún)
2、 參數(shù)查詢(xún)、命名參數(shù)查詢(xún)
3、 關(guān)聯(lián)查詢(xún)
4、 分頁(yè)查詢(xún)
5、 統(tǒng)計(jì)函數(shù)
6. 如何優(yōu)化Hibernate?
1.使用雙向一對(duì)多關(guān)聯(lián),不使用單向一對(duì)多
2.靈活使用單向一對(duì)多關(guān)聯(lián)
3.不用一對(duì)一,用多對(duì)一取代
4.配置對(duì)象緩存,不使用集合緩存
5.一對(duì)多集合使用Bag,多對(duì)多集合使用Set
6. 繼承類(lèi)使用顯式多態(tài)
7. 表字段要少,表關(guān)聯(lián)不要怕多,有二級(jí)緩存撐腰
1.Hibernate有哪幾種查詢(xún)數(shù)據(jù)的方式
(1)導(dǎo)航對(duì)象圖查詢(xún)
(2)OID查詢(xún)
(3)HQL
(4)QBC
(5)本地SQL
2.load()和get()的區(qū)別
load加載方法:
Java代碼
Users user = (Users)session.load(Users.class, userId); Users user = (Users)session.load(Users.class, userId);
get加載方法:
Java代碼
Users user = (Users)session.get(Users.class, userId); Users user = (Users)session.get(Users.class, userId);
兩加載方法區(qū)別:
區(qū)別1:如果數(shù)據(jù)庫(kù)中,沒(méi)有userId的對(duì)象。如果通過(guò)get方法加載,則返回的是一個(gè)null;如果通過(guò)load加載,則返回一個(gè)代理對(duì)象,如果后面代碼如果調(diào)用user對(duì)象的某個(gè)屬性(比如user.getPassword())會(huì)拋出異常:org.hibernate.ObjectNotFoundException;
區(qū)別2:load支持延遲加載,get不支持延遲加載。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
java?random隨機(jī)數(shù)的用法及常見(jiàn)應(yīng)用場(chǎng)景
這篇文章主要給大家介紹了關(guān)于java?random隨機(jī)數(shù)的用法及常見(jiàn)應(yīng)用場(chǎng)景的相關(guān)資料,Java中的Random類(lèi)是用來(lái)生成偽隨機(jī)數(shù)的工具類(lèi),它可以用來(lái)生成隨機(jī)的整數(shù)、浮點(diǎn)數(shù)和布爾值,需要的朋友可以參考下2023-11-11java 實(shí)現(xiàn)圖片圓角處理、背景透明化
這篇文章主要介紹了java 實(shí)現(xiàn)圖片圓角處理、背景透明化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11java中l(wèi)ambda表達(dá)式簡(jiǎn)單用例
讓我們從最簡(jiǎn)單的例子開(kāi)始,來(lái)學(xué)習(xí)如何對(duì)一個(gè)string列表進(jìn)行排序。我們首先使用Java 8之前的方法來(lái)實(shí)現(xiàn)2016-09-09Java實(shí)現(xiàn)SSL Socket長(zhǎng)連接方式
這篇文章主要介紹了Java實(shí)現(xiàn)SSL Socket長(zhǎng)連接方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Java編寫(xiě)實(shí)現(xiàn)九宮格應(yīng)用
這篇文章主要為大家詳細(xì)介紹了Java編寫(xiě)實(shí)現(xiàn)九宮格應(yīng)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05