JPA和Hibernate究竟是什麼關係???

(文章借用了其餘幾篇博客中的內容,由於是初學者,許多概念性的關係本身不能徹底理解,就將大神的搬了過來,若有不當,可留言,本人自會妥善處理,謝謝)sql

在學習框架的過程當中,發現學的東西不少,可是感受他們之間的聯繫區別都不是很瞭解,知道JPA能夠去實現持久化數據到數據庫當中,Hibernate也有這樣的功能,總覺得他們之間是一種平級的關係,擁有一樣的做用,是一種能夠相互替代的關係,就像你吃飯時,選擇吃米飯和吃麪條同樣,然而,在進行了一番搜索以後,發現並非那麼回事兒。數據庫

JPA自己是一種規範,它的本質是一種ORM規範(不是ORM框架,由於JPA並未提供ORM實現,只是制定了規範)由於JPA是一種規範,因此,只是提供了一些相關的接口,可是接口並不能直接使用,JPA底層須要某種JPA實現,JPA如今就是Hibernate功能的一個子集session

Hibernate 從3.2開始,就開始兼容JPA。Hibernate3.2得到了Sun TCK的 JPA(Java  Persistence API) 兼容認證。JPA和Hibernate之間的關係,能夠簡單的理解爲JPA是標準接口,Hibernate是實現,並非對標關係,借用下圖能夠看清楚他們之間的關係,Hibernate屬於遵循JPA規範的一種實現,可是JPA是Hibernate遵循的規範之一,Hibernate還有其餘實現的規範因此它們的關係更像是JPA是一種作麪條的規範,而Hibernate是一種遵循作麪條的規範的湯麪,他不只遵循了作麪條的規範,同時也會遵循作湯和調料的其餘規範,他們之間並非吃麪條和吃米飯的關係框架

1.JPAide

  JPA全稱: Java Persistence API,JPA經過JDK 5.0註解或XML描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中。
  JPA的出現有兩個緣由:
  其一,簡化現有Java EE和Java SE應用的對象持久化的開發工做;
  其二,Sun但願整合對ORM技術,實現持久化領域的統一。學習

 Sun之因此提出JPA規範,其目的是以官方身份來統一各類ORM框架的規範,包括著名的Hibernate、TopLink等
 不過JPA規範給開發者帶來了福音:開發者面向JPA規範的接口,但底層的JPA實現能夠任意切換:以爲Hibernate好的,能夠選擇Hibernate JPA實現;以爲TopLink好的,能夠選擇TopLink JPA實現……這樣開發者能夠避免爲使用Hibernate學習一套ORM框架,爲使用TopLink又要再學習一套ORM框架

  JPA提供的技術:
  (1)ORM映射元數據
  JPA支持XML和JDK 5.0註解兩種元數據的形式,元數據描述對象和表之間的映射關係,框架據此將實體對象持
  久化到數據庫表中;
  (2)JPA 的API
  用來操做實體對象,執行CRUD操做,框架在後臺替咱們完成全部的事情,開發者從繁瑣的JDBC和SQL代碼中解
  脫出來。
  (3)查詢語言
  經過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的SQL語句緊密耦合spa

2. Hibernatehibernate

  JPA是須要Provider來實現其功能的,Hibernate就是JPA Provider中很強的一個。3d

  例如: 對象

  (1)實體對象的狀態,在Hibernate有自由、持久、遊離三種,JPA裏有new,managed,detached,removed,而這些狀態都是一一對應的。

  (2)flush方法,都是對應的,

  (3)Query query = manager.createQuery(sql),它在Hibernate裏寫法上是session,而在JPA中變成了  manager

3.  JPA和Hibernate之間的關係,能夠簡單的理解爲JPA是標準接口,Hibernate是實現。

  那麼Hibernate是如何實現與JPA 的這種關係的呢?

  Hibernate主要是經過三個組件來實現的,及hibernate-annotation、hibernate-entitymanager和hibernate-core。

  (1)hibernate-annotation是Hibernate支持annotation方式配置的基礎,它包括了標準的JPA annotation以及  Hibernate自身特殊功能的annotation。

  (2)hibernate-core是Hibernate的核心實現,提供了Hibernate全部的核心功能。

  (3)hibernate-entitymanager實現了標準的JPA,能夠把它當作hibernate-core和JPA之間的適配器,它並不直接提供ORM的功能,而是對hibernate-core進行封裝,使得Hibernate符合JPA的規範。

  總的來講,JPA是規範,Hibernate是框架,JPA是持久化規範,而Hibernate實現了JPA。

題外的一些思考:若是拋開JPA直接使用Hibernate的註解來定義一個實例,很快發現了幾個問題:

  1. jpa中有Entity, Table,hibernate中也有,可是內容不一樣
  2. jpa中有Column,OneToMany等,Hibernate中沒有,也沒有替代品

          hibernate對jpa的支持,不是另提供了一套專用於jpa的註解。一些重要的註解如Column, OneToMany等,hibernate沒有提供,這說明jpa的註解已是hibernate 的核心,hibernate只提供了一些補充,而不是兩套註解。要是這樣,hibernate對jpa的支持還真夠足量,咱們要使用hibernate註解就一定要使用jpa。

兩個額外的問題

第一個是問若是想用hibernate註解,是否是必定會用到jpa的。網友的回答:「是。若是hibernate認爲jpa的註解夠用,就直接用。不然會弄一個本身的出來做爲補充」

第二個是問,jpa和hibernate都提供了Entity,咱們應該用哪一個,仍是說能夠兩個一塊兒用?網友回答說「Hibernate的Entity是繼承了jpa的,因此若是以爲jpa的不夠用,直接使用hibernate的便可」

相關文章
相關標籤/搜索