JAVA Hibernate工作原理及為什麼要用

來源:互聯網
上載者:User

標籤:ber   添加   財務   測試   lan   版本   機制   處理   二級緩衝   

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緩衝的作用:    Hibernate是一個持久層架構,經常訪問物理資料庫,為了降低應用程式對物理資料來源訪問的頻次,從而提高應用程式的運行效能。緩衝內的資料是對物理資料來源中的資料的複製,應用程式在運行時從緩衝讀寫資料,在特定的時刻或事件會同步緩衝和物理資料來源的資料Hibernate緩衝分類:  Hibernate緩衝包括兩大類:Hibernate一級緩衝和Hibernate二級緩衝Hibernate一級緩衝又稱為“Session的緩衝”,它是內建的,意思就是說,只要你使用hibernate就必須使用session緩衝。由於Session對象的生命週期通常對應一個資料庫事務或者一個應用事務,因此它的緩衝是事務範圍的緩衝。在第一級緩衝中,持久化類的每個執行個體都具有唯一的OID。 Hibernate二級緩衝又稱為“SessionFactory的緩衝”,由於SessionFactory對象的生命週期和應用程式的整個過程對應,因此Hibernate二級緩衝是進程範圍或者叢集範圍的緩衝,有可能出現並發問題,因此需要採用適當的並發存取原則,該策略為被緩衝的資料提供了交易隔離等級。第二級緩衝是可選的,是一個可配置的外掛程式,在預設情況下,SessionFactory不會啟用這個外掛程式。什麼樣的資料適合存放到第二級緩衝中?   1 很少被修改的資料   2 不是很重要的資料,允許出現偶爾並發的資料   3 不會被並發訪問的資料   4 常量資料   不適合存放到第二級緩衝的資料?   1經常被修改的資料   2 .絕對不允許出現並發訪問的資料,如財務資料,絕對不允許出現並發   3 與其他應用共用的資料。 Hibernate尋找對象如何應用緩衝?當Hibernate根據ID訪問資料對象的時候,首先從Session一級緩衝中查;查不到,如果配置了二級緩衝,那麼從二級緩衝中查;如果都查不到,再查詢資料庫,把結果按照ID放入到緩衝刪除、更新、增加資料的時候,同時更新緩衝Hibernate管理緩衝執行個體無論何時,我們在管理Hibernate緩衝(Managing the caches)時,當你給save()、update()或saveOrUpdate()方法傳遞一個對象時,或使用load()、 get()、list()、iterate() 或scroll()方法獲得一個對象時, 該對象都將被加入到Session的內部緩衝中。 當隨後flush()方法被調用時,對象的狀態會和資料庫取得同步。 如果你不希望此同步操作發生,或者你正處理大量對象、需要對有效管理記憶體時,你可以調用evict() 方法,從一級緩衝中去掉這些對象及其集合。 

 

 

 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操作資料
        提交事務
        關閉資源

轉 http://www.cnblogs.com/dashi/p/3597969.html#commentform

 

JAVA Hibernate工作原理及為什麼要用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.