Java基礎之Hibernate

Hibernate是一個什麼樣的框架?

  Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關係,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。

  Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。

 

Hibernate對象存在哪三種狀態?

三種狀態:瞬時態(Transient)、 持久態(Persistent)、遊離狀態(脫管狀態)(Detached)。處於持久態的對象也稱爲PO(Persistence Object),瞬時對象和脫管對象也稱爲VO(Value Object)。

http://blog.csdn.net/redarmy_chen/article/details/7069482

(1) 瞬時狀態:
由new操作符創建,且尚未與Hibernate Session關聯的對象被認定爲瞬時(Transient)的。瞬時(Transient)對象不會被持久化到數據庫中,也不會被賦予持久化標識(identifier)。如果瞬時(Transient)對象在程序中沒有被引用,它會被垃圾回收器(garbage collector)銷燬。使用Hibernate Session可以將其變爲持久(Persistent)狀態。(Hibernate會自動執行必要的SQL語句)。
瞬時狀態的特點有:
1、 與數據庫中的記錄沒有任何關聯,也就是沒有與其相關聯的數據庫記錄。
2、 與Session沒有任何關係,也就是沒有通過Session對象的實例對其進行任何持久化的操作。

 

(2) 持久狀態:
持久(Persistent)是實例在數據庫中有對應的記錄,並擁有一個持久化標識(identifier)。持久(Persistent)的實例可能是剛被保存的,或剛被加載的,無論哪一種,按定義,它存在於相關聯的Session作用範圍內。Hibernate會檢測到處於持久(Persistent)狀態的對象的任何改動,在當前操作單元(unit of work)執行完畢時將對象數據(state)與數據庫同步(synchronize)。開發者不需要手動執行Update。將對象從持久(Persistent)狀態編程瞬時(Transient)狀態同樣也不需要手動執行delete語句。
持久對象具有如下特點:
1、 和session實例關聯;
2、 在數據庫中有與之關聯的記錄。
3、 Hibernate會根據持久態對象的屬性的變化而改變數據庫中的相應記錄。

 

(3)脫管狀態:
與持久(Persistent)狀態對象關聯的Session被關閉後,對象就變爲脫管(Detached)的。對脫管(Detached)對象的引用依然有效,對象可繼續被修改。脫管(Detached)對象如果重新關聯到某個新的Session上,會再次轉變爲持久(Transistent)的(在脫管Detached其間的改動將被持久化到數據庫)。這個功能使得一種編程模型,即中間會給用戶思考時間(user think-time)的長時間運行的操作單元(unit of work).
脫管對象擁有數據庫的識別值,可通過update()、saveOrUpdate()等方法,轉變成持久對象。
脫管對象具有如下特點:
1、 本質上與瞬時對象相同,在沒有任何變量引用它時,JVM會在適當的時候將它回收;
2、 比瞬時對象多了一個數據庫記錄標識值。
3、 不在於Session相關聯。
4、 脫管對象一定是由持久態對象轉化而來。

 

 

Hibernate工作原理?
1.讀取並解析配置文件
2.讀取並解析映射信息,創建SessionFactory
3.打開Sesssion
4.創建事務Transation
5.持久化操作
6.提交事務
7.關閉Session
8.關閉SesstionFactory

優點:
1.    對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。

2.    Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作

3.    hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。

4.    hibernate的性能非常好,因爲它是個輕量級框架。映射的靈活性很出色。它支持各種關係數據庫,從一對一到多對多的各種複雜關係。


Hibernate是如何延遲加載?


1.  Hibernate2 延遲加載實現:a)實體對象 b)集合(Collection)

2. Hibernate3 提供了屬性的延遲加載功能

當Hibernate在查詢數據的時候,數據並沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提高了服務器的性能。


Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係)

類與類之間的關係主要體現在表與表之間的關係進行操作,它們都市對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、

 說下Hibernate的緩存機制

1. 內部緩存存在Hibernate中又叫一級緩存,屬於應用事物級緩存

2. 二級緩存:
a) 應用及緩存
b) 分佈式緩存
條件:數據不會被第三方修改、數據大小在可接受範圍、數據更新頻率低、同一數據被系統頻繁使用、非              關鍵數據
c) 第三方緩存的實現


Hibernate的查詢方式
Sql、Criteria,object comptosition
Hql:
1、 屬性查詢
2、 參數查詢、命名參數查詢
3、 關聯查詢
4、 分頁查詢
5、 統計函數

如何優化Hibernate?
1.使用雙向一對多關聯,不使用單向一對多
2.靈活使用單向一對多關聯
3.不用一對一,用多對一取代
4.配置對象緩存,不使用集合緩存
5.一對多集合使用Bag,多對多集合使用Set
6. 繼承類使用顯式多態
7. 表字段要少,表關聯不要怕多,有二級緩存撐腰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章