1. 程式人生 > >JAVA Hibernate工作原理及為什麼要用

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快取的作用:
    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操作資料
        提交事務
        關閉資源

相關推薦

hibernate工作原理作用 JAVA Hibernate工作原理為什麼

轉載自 http://www.cnblogs.com/dashi/p/3597969.html#commentform JAVA Hibernate工作原理及為什麼要用 hibernate 簡介:hibernate是一個開源框架,它是物件關聯關係對映的框架,它對JDBC做了輕量級的封裝,而我們j

JAVA Hibernate工作原理為什麼

hibernate 簡介:hibernate是一個開源框架,它是物件關聯關係對映的框架,它對JDBC做了輕量級的封裝,而我們java程式設計師可以使用面向物件的思想來操縱資料庫。hibernate核心介面session:負責被持久化物件CRUD操作sessionFactory:負責初始化hibernate,建

hibernate 工作原理為什麽

bsp 什麽 分享 com 為什麽 .com 分享圖片 image inf hibernate 工作原理及為什麽要用

Hibernate工作原理為什麼

原理: 1.讀取並解析配置檔案 2.讀取並解析對映資訊,建立SessionFactory3.開啟Session 4.建立事務Transation 5.持久化操作 6.提交事務 7.關閉Session 8.關閉SesstionFactory為什麼要用: 1. 對JDBC訪問資料

Java LinkedList工作原理實現

++ 部分 更多 size mov info 容量限制 element git 1. 概述 以雙向鏈表實現。鏈表無容量限制,但雙向鏈表本身使用了更多空間,也需要額外的鏈表指針操作。 按下標訪問元素—get(i)/set(i,e) 要悲劇的遍歷鏈表將指針移動到位(如果i&g

JAVA NIO工作原理程式碼示例

簡介:本文主要介紹了JAVA NIO中的Buffer, Channel, Selector的工作原理以及使用它們的若干注意事項,最後是利用它們實現伺服器和客戶端通訊的程式碼例項。 歡迎探討,如有錯誤敬請指正 1. ByteBuffer 1.1直接緩衝區和非直接緩衝區 下面是建立ByteBuffer物件的

Java HashMap工作原理實現

1. 概述 從本文你可以學習到: 什麼時候會使用HashMap?他有什麼特點?你知道HashMap的工作原理嗎?你知道get和put的原理嗎?equals()和hashCode()的都有什麼作用?你知道hash的實現嗎?為什麼要這樣實現?如果HashMap的大小超過了負

hibernate工作原理作用

hibernate 簡介: hibernate是一個開源框架,它是物件關聯關係對映的框架,它對JDBC做了輕量級的封裝,而我們java程式設計師可以使用面向物件的思想來操縱資料庫。 hibernate核心介面 session:負責被持久化物件CRUD操作 sessionFactory:負責初始化hibern

Java HashMap工作原理實現(二)

類宣告 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 功能和特點 實現Abs

hibernate工作原理流程

使用hibernate開發了幾次小專案,但仍感覺對其理解的不是很到位,在這裡寫篇部落格加深理解。 同學習struts一樣,我個人認為要想熟練掌握一個框架,必先理解其原理。如果只是會用而不知其所以然,這跟照葫蘆畫瓢沒什麼區別。而且後續深入也會很吃力。 在瞭解原理前,先來了解下

HTTP協議報文、工作原理Java中的HTTP通信技術詳解

tor 報文 buffered mod protoc 禁止 ans 請求報文 客戶端 博客園 首頁 新隨筆 聯系 管理 訂閱

HTTP協議報文、工作原理Java中的HTTP通訊技術詳解

一、web及網路基礎       1、HTTP的歷史            1.1、HTTP的概念:         &nb

Java】Java8 HashMap工作原理實現

1 、概述 從本文你可以學到 什麼時候會使用HashMap?他有什麼特點? 你知道HashMap的工作原理嗎? 你知道get和put的原理嗎?equals()和hashCode()的都有什麼作用? 你知道hash的實現嗎?

Java HashMap的工作原理 各種Map區別

一、Java HashMap的工作原理 面試的時候經常會遇見諸如:“java中的HashMap是怎麼工作的”,“HashMap的get和put內部的工作原理”這樣的問題。 Put : 讓我們看下put方法的實現: public V put(K key, V value) {

hibernate 的概念透析、工作原理作用

hibernate是一個開源框架,它是物件關聯關係對映的框架,它對JDBC做了輕量級的封裝,而我們Java程式設計師可以使用面向物件的思想來操縱資料庫。 hibernate核心介面 session:負責被持久化物件CRUD操作 sessionFactory:負責初始化hibernate,建立session

Java 集合:TreeMap工作原理實現

前言 本文轉載自:點這裡,該部落格非常不錯,建議前去看看。 正文 1. 概述 A Red-Black tree based NavigableMap implementation. The map is sorted according to the natura

Webservice工作原理實例

服務端 標準 httppost tac 函數 特定 測試類 數據 綁定 一、Web Service基本概念 Web Service也叫XML Web Service WebService是一種可以接收從Internet或者Intranet上的其它系統中傳遞過來的請求

(一)JAVA Web工作原理

服務器 t對象 對象 如果 servle bsp servlet實例 init () servlet的運行過程:   web服務器收到客戶端的HTTP請求後, 1)web服務器首先檢查是否已裝載並創建了該servlet的實例對象,如果是,直接第4)步。

keepalived工作原理裂腦

keepalived   裂腦1. keepalived服務的工作原理(重點)ükeepalived高可用對之間是通過VRRP協議通信的,因此,我們從VRRP協議介紹:üvrrp協議,全稱virtual router redundancy protocol ,中文名名為虛擬路由冗余協議,VRRP

三層交換工作原理配置

三層交換機 mls(多層交換) cef(cisco快速轉發) 配置命令 楊書凡 三層交換機就是具有部分路由器功能的交換機,三層交換機的最重要目的是加快大型局域網內部的數據交換,所具有的路由功能也是為這目的服務的,能夠做到一次路由,多次轉發。三層交換技術就是二層交換技術+三層轉發技術。