淺談Hibernate與Jpa的區別與聯繫

在討論Hibernate與Jpa的關係是,首先要明確Jpa的用途。JPA全稱爲Java Persistence API ,Java持久化API是Sun公司在Java EE 5規範中提出的Java持久化接口。JPA吸收了目前Java持久化技術的優勢,旨在規範、簡化Java對象的持久化工做。使用JPA持久化對象,並非依賴於某一個ORM框架。與Jpa相關的就是這個ORM技術,ORM 是Object-Relation-Mapping,即對象關係影射技術,是對象持久化的核心。ORM是對JDBC的封裝,從而解決了JDBC的各類存在問題:java

a) 繁瑣的代碼問題
用JDBC的API編程訪問數據庫,代碼量較大,特別是訪問字段較多的表的時候,代碼顯得繁瑣、累贅,容易出錯。ORM則創建了Java對象與數據庫對象之間的影射關係,程序員不須要編寫複雜的SQL語句,直接操做Java對象便可,從而大大下降了代碼量,也使程序員更加專一於業務邏輯的實現。程序員

b) 數據庫對象鏈接問題
關係數據對象之間,存在各類關係,包括1對一、1對多、多對一、多對多、級聯等。在數據庫對象更新的時候,採用JDBC編程,必須十分當心處理這些關係,以保證維持這些關係不會出現錯誤,而這個過程是一個很費時費力的過程。
ORM創建Java對象與數據庫對象關係影射的同時,也自動根據數據庫對象之間的關係建立Java對象的關係,而且提供了維持這些關係完整、有效的機制。數據庫

c) 系統架構問題
JDBC屬於數據訪問層,可是使用JDBC編程時,必須知道後臺是用什麼數據庫、有哪些表、各個表有有哪些字段、各個字段的類型是什麼、表與表之間什麼關係、建立了什麼索引等等與後臺數據庫相關的詳細信息。
使用ORM技術,能夠將數據庫層徹底隱蔽,呈獻給程序員的只有Java的對象,程序員只須要根據業務邏輯的須要調用Java對象的Getter和 Setter方法,便可實現對後臺數據庫的操做,程序員沒必要知道後臺採用什麼數據庫、有哪些表、有什麼字段、表與表之間有什麼關係。編程

d) 性能問題
採用JDBC編程,在不少時候存在效率低下的問題。架構


pstmt =conn.prepareStatement("insert into user_info values(?,?)");
       for (int i=0; i<1000; i++) {
          pstmt.setInt(1,i);
          pstmt.setString(2,"User"+i.toString());
          pstmt.executeUpdate();
       }app


以上程序將向後臺數據庫發送1000次SQL語句執行請求,運行效率較低。
採用ORM技術,ORM框架將根據具體數據庫操做須要,會自動延遲向後臺數據庫發送SQL請求,ORM也能夠根據實際狀況,將數據庫訪問操做合成,儘可能減小沒必要要的數據庫操做請求。
知道Jpa是一種規範,而Hibernate是它的一種實現。除了Hibernate,還有EclipseLink(曾經的toplink),OpenJPA等可供選擇,因此使用Jpa的一個好處是,能夠更換實現而沒必要改動太多代碼。
在play中定義Model時,使用的是jpa的annotations,好比javax.persistence.Entity, Table, Column, OneToMany等等。但它們提供的功能基礎,有時候想定義的更細一些,不免會用到Hibernate自己的annotation。我當時想,jpa這 麼弱還要用它幹什麼,爲何不直接使用hibernate的?反正我又不會換成別的實現。由於我很快決定再也不使用hibernate,這個問題就一直放下了。直到我如今在新公司,作項目要用到Hibernate。
我想拋開jpa,直接使用hibernate的註解來定義Model,很快發現了幾個問題:
jpa中有Entity, Table,hibernate中也有,可是內容不一樣;
jpa中有Column,OneToMany等,Hibernate中沒有,也沒有替代品;
我原覺得hibernate對jpa的支持,是另提供了一套專用於jpa的註解,但如今看起來彷佛不是。一些重要的註解如Column, OneToMany等,hibernate沒有提供,這說明jpa的註解已是hibernate的核心,hibernate只提供了一些補充,而不是兩 套註解。要是這樣,hibernate對jpa的支持還真夠足量,咱們要使用hibernate註解就一定要使用jpa。
 框架

相關文章
相關標籤/搜索