JPA和Hibernate到底是什么關系???


(文章借用了其他幾篇博客中的內容,因為是初學者,許多概念性的關系自己不能完全理解,就將大神的搬了過來,如有不當,可留言,本人自會妥善處理,謝謝)

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

JPA本身是一種規范,它的本質是一種ORM規范(不是ORM框架,因為JPA並未提供ORM實現,只是制定了規范)因為JPA是一種規范,所以,只是提供了一些相關的接口,但是接口並不能直接使用,JPA底層需要某種JPA實現,JPA現在就是Hibernate功能的一個子集

Hibernate 從3.2開始,就開始兼容JPA。Hibernate3.2獲得了Sun TCK的 JPA(Java  Persistence API) 兼容認證。JPA和Hibernate之間的關系,可以簡單的理解為JPA是標准接口,Hibernate是實現,並不是對標關系,借用下圖可以看清楚他們之間的關系,Hibernate屬於遵循JPA規范的一種實現,但是JPA是Hibernate遵循的規范之一,Hibernate還有其他實現的規范所以它們的關系更像是JPA是一種做面條的規范,而Hibernate是一種遵循做面條的規范的湯面,他不僅遵循了做面條的規范,同時也會遵循做湯和調料的其他規范,他們之間並不是吃面條和吃米飯的關系

1.JPA

  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語句緊密耦合

2. Hibernate

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

  例如: 

  (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的即可”

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM