hibernate工作原理及作用 JAVA Hibernate工作原理及為什麼要用
轉載自 http://www.cnblogs.com/dashi/p/3597969.html#commentform
JAVA Hibernate工作原理及為什麼要用
hibernate 簡介:
hibernate是一個開源框架,它是物件關聯關係對映的框架,它對JDBC做了輕量級的封裝,而我們java程式設計師可以使用面向物件的思想來操縱資料庫。
hibernate核心介面
session:負責被持久化物件CRUD操作
sessionFactory:負責初始化hibernate,建立session物件
configuration:負責配置並啟動hibernate,建立SessionFactory
Transaction:負責事物相關的操作
Query和Criteria介面:負責執行各種資料庫查詢
hibernate工作原理:
1.通過Configuration config = new Configuration().configure();//讀取並解析hibernate.cfg.xml配置檔案
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>讀取並解析對映資訊
3.通過SessionFactory sf = config.buildSessionFactory();//建立SessionFactory
4.Session session = sf.openSession();//開啟Sesssion
5.Transaction tx = session.beginTransaction();//建立並啟動事務Transation
6.persistent operate操作資料,持久化操作
7.tx.commit();//提交事務
8.關閉Session
9.關閉SesstionFactory
為什麼要用hibernate:
1. 對JDBC訪問資料庫的程式碼做了封裝,大大簡化了資料訪問層繁瑣的重複性程式碼。
2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作
3. hibernate使用Java反射機制,而不是位元組碼增強程式來實現透明性。
4. hibernate的效能非常好,因為它是個輕量級框架。對映的靈活性很出色。它支援各種關係資料庫,從一對一到多對多的各種複雜關係。
Hibernate是如何延遲載入?get與load的區別
1. 對於Hibernate get方法,Hibernate會確認一下該id對應的資料是否存在,首先在session快取中查詢,然後在二級快取中查詢,還沒有就查詢資料庫,資料 庫中沒有就返回null。這個相對比較簡單,也沒有太大的爭議。主要要說明的一點就是在這個版本(bibernate3.2以上)中get方法也會查詢二級快取!
2. Hibernate load方法載入實體物件的時候,根據對映檔案上類級別的lazy屬性的配置(預設為true),分情況討論:
(1)若為true,則首先在Session快取中查詢,看看該id對應的物件是否存在,不存在則使用延遲載入,返回實體的代理類物件(該代理類為實體類的子類,由CGLIB動態生成)。等到具體使用該物件(除獲取OID以外)的時候,再查詢二級快取和資料庫,若仍沒發現符合條件的記錄,則會丟擲一個ObjectNotFoundException。
(2)若為false,就跟Hibernateget方法查詢順序一樣,只是最終若沒發現符合條件的記錄,則會丟擲一個ObjectNotFoundException。
這裡get和load有兩個重要區別:
如果未能發現符合條件的記錄,Hibernate get方法返回null,而load方法會丟擲一個ObjectNotFoundException。
load方法可返回沒有載入實體資料的代 理類例項,而get方法永遠返回有實體資料的物件。
(對於load和get方法返回型別:好多書中都說:“get方法永遠只返回實體類”,實際上並不正 確,get方法如果在session快取中找到了該id對應的物件,如果剛好該物件前面是被代理過的,如被load方法使用過,或者被其他關聯物件延遲加 載過,那麼返回的還是原先的代理物件,而不是實體類物件,如果該代理物件還沒有載入實體資料(就是id以外的其他屬性資料),那麼它會查詢二級快取或者數 據庫來載入資料,但是返回的還是代理物件,只不過已經載入了實體資料。)
總之對於get和load的根本區別,一句話,hibernate對於 load方法認為該資料在資料庫中一定存在,可以放心的使用代理來延遲載入,如果在使用過程中發現了問題,只能拋異常;而對於get方 法,hibernate一定要獲取到真實的資料,否則返回null。
Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係)
類與類之間的關係主要體現在表與表之間的關係進行操作,它們都市對物件進行操作,我們程式中把所有的表與類都對映在一起,它們通過配置檔案中的many-to-one、one-to-many、many-to-many、
說下Hibernate的快取機制:
Hibernate的查詢方式
Sql、Criteria,object comptosition
Hql:
1、 屬性查詢
2、 引數查詢、命名引數查詢
3、 關聯查詢
4、 分頁查詢
5、 統計函式
如何優化Hibernate?
1.使用雙向一對多關聯,不使用單向一對多
2.靈活使用單向一對多關聯
3.不用一對一,用多對一取代
4.配置物件快取,不使用集合快取
5.一對多集合使用Bag,多對多集合使用Set
6. 繼承類使用顯式多型
7. 表字段要少,表關聯不要怕多,有二級快取撐腰
hibernate的開發步驟:
開發步驟
1)搭建好環境
引入hibernate最小的jar包
準備Hibernate.cfg.xml啟動配置檔案
2)寫實體類(pojo)
3)為實體類寫對映檔案"User.hbm.xml"
在hibernate.cfg.xml新增對映的實體
4)建立庫表
5)寫測試類
獲得Configuration
建立SessionFactory
開啟Session
開啟事務
使用session操作資料
提交事務
關閉資源