Hibernate工作原理及優缺點詳解

jopen 8年前發布 | 39K 次閱讀 Hibernate 持久層框架

Hibernate工作原理

Hibernate使用了J2EE架構中的如下技術:JDBC、JTA、JNDI。其中JDBC是一個支持關系數據庫操作的一個基礎層;它與JNDI和JTA一起結合,使得Hibernate可以方便地集成到J2EE應用服務器中去。

在這里,我們不會詳細地去討論Hibernate API接口中的所有方法,我們只簡要講一下每個主要接口的功能,如果你想了解得更多的話,你可以在Hibernate的源碼包中的net.sf.hibernate子包中去查看這些接口的源代碼。

下面我們依次講一下所有的主要接口:

核心接口

以下5個核心接口幾乎在任何實際開發中都會用到。通過這些接口,你不僅可以存儲和獲得持久對象,并且能夠進行事務控制。

Session接口 Session接口對于Hibernate 開發人員來說是一個最重要的接口。然而在Hibernate中,實例化的Session是一個輕量級的類,創建和銷毀它都不會占用很多資源。這在實際項目中確實很重要,因為在客戶程序中,可能會不斷地創建以及銷毀Session對象,如果Session的開銷太大,會給系統帶來不良影響。

SessionFactory 接口 這里用到了一個設計模式――工廠模式,用戶程序從工廠類SessionFactory中取得Session的實例。  令你感到奇怪的是SessionFactory并不是輕量級的!實際上它的設計者的意圖是讓它能在整個應用中共享。典型地來說,一個項目通常只需要一個SessionFactory就夠了,但是當你的項目要操作多個數據庫時,那你必須為每個數據庫指定一個SessionFactory。 SessionFactory在Hibernate中實際起到了一個緩沖區的作用,它緩沖了Hibernate自動生成的SQL語句和一些其它的映射數據,還緩沖了一些將來有可能重復利用的數據。

Configuration 接口 Configuration接口的作用是對Hibernate進行配置,以及對它進行啟動。在Hibernate的啟動過程中,Configuration類的實例首先定位映射文檔的位置,讀取這些配置,然后創建一個SessionFactory對象。

Query和Criteria接口 Query接口讓你方便地對數據庫及持久對象進行查詢,它可以有兩種表達方式:HQL語言或本地數據庫的SQL語句。Query經常被用來綁定查詢參數、限制查詢記錄數量,并最終執行查詢操作。 Criteria接口與Query接口非常類似,它允許你創建并執行面向對象的標準化查詢。 值得注意的是Query接口也是輕量級的,它不能在Session之外使用。

Callback 接口 當一些有用的事件發生時――例如持久對象的載入、存儲、刪除時,Callback接口會通知Hibernate去接收一個通知消息。一般而言,Callback接口在用戶程序中并不是必須的,但你要在你的項目中創建審計日志時,你可能會用到它。以下是它的策略接口:

*主鍵的生成 (IdentifierGenerator 接口)

*本地SQL語言支持 (Dialect 抽象類)

*緩沖機制 (Cache 和CacheProvider 接口)

*JDBC 連接管理 (ConnectionProvider接口)

*事務管理 (TransactionFactory, Transaction, 和 TransactionManagerLookup 接口)

*ORM 策略 (ClassPersister 接口)

*屬性訪問策略 (PropertyAccessor 接口)

*代理對象的創建 (ProxyFactory接口)

Hibernate為以上所列的機制分別創建了一個缺省的實現,因此如果你只是要增強它的某個策略的功能的話,只需簡單地繼承這個類就可以了,沒有必要從頭開始寫代碼。

Hibernate運行在兩種環境下:可管理環境和不可管理環境

1、可管理環境這種環境可管理如下資源:池資源管理,諸如數據庫連接池和,還有事務管理、安全定義。一些典型的J2EE服務器(JBoss、Weblogic、WebSphere)已經實現了這些。

2、不可管理環境只是提供了一些基本的功能,諸如像Jetty或Tomcat這樣的servlet容器環境。

Hibernate的優點:

優點:

Hibernate是JDBC的輕量級的對象封裝,它是一個獨立的對象持久層框架。Hibernate可以用在任何JDBC可以使用的場合,例如Java應用程序的數據庫訪問代碼,DAO接口的實現類,甚至可以是BMP里面的訪問數據庫的代碼。

Hibernate是一個和JDBC密切關聯的框架,所以Hibernate的兼容性和JDBC驅動,和數據庫都有一定的關系,但是和使用它的Java程序,和App Server沒有任何關系,也不存在兼容性問題。

Hibernate不能用來直接和Entity Bean做對比,只有放在整個J2EE項目的框架中才能比較。并且即使是放在軟件整體框架中來看,Hibernate也是做為JDBC的替代者出現的,而不是Entity Bean的替代者出現的,

Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。

Hibernate可以應用在任何使用JDBC的場合。

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

Hibernate 的性能非常好,因為它是個輕量級框架。 映射的靈活性很出色。

它支持各種關系數據庫,從一對一到多對多的各種復雜關系。

缺點:

它限制您所使用的對象模型。(例如,一個持久性類不能映射到多個表)。

讓我再列一次我已經列n次的框架結構:

傳統的架構:1Session BeanEntity BeanDB

為了解決性能障礙的替代架構:2Session BeanDAOJDBCDB

使用Hibernate來提高上面架構的開發效率的架構:3Session BeanDAOHibernateDB

以上就是e良師益友為大家詳細講解的三大框架中Hibernate的原理及其優缺點!

來自: http://www.elsyy.com/news/2015/1123/151590527.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!