JPA規範本質上就是一種ORM規範,注意不是ORM框架——由於JPA並未提供ORM實現,它只是制訂了一些規範,提供了一些編程的API接口,但具體實現則由服務廠商來提供實現,JBoss應用服務器底層就以Hibernate做爲JPA的實現。java
既然JPA做爲一種規範——也就說JPA規範中提供的只是一些接口,顯然接口不能直接拿來使用。雖然應用程序能夠面向接口編程,但JPA底層必定須要某種JPA實現,不然JPA依然沒法使用。spring
從筆者的視角來看,Sun之因此提出JPA規範,其目的是以官方的身份來統一各類ORM框架的規範,包括著名的Hibernate、TopLink等。不過JPA規範給開發者帶來了福音:開發者面向JPA規範的接口,但底層的JPA實現能夠任意切換:以爲Hibernate好的,能夠選擇Hibernate JPA實現;以爲TopLink好的,能夠選擇TopLink JPA實現……這樣開發者能夠避免爲使用Hibernate學習一套ORM框架,爲使用TopLink又要再學習一套ORM框架。數據庫
下圖是JPA和Hibernate、TopLink等ORM框架之間的關係:編程
JPA規範與ORM框架之間的關係緩存
JPA和Hibernate的關係就像JDBC和JDBC驅動的關係,JPA是規範,Hibernate除了做爲ORM框架以外,它也是一種JPA實現。JPA怎麼取代Hibernate呢?JDBC能夠驅動JDBC驅動嗎?服務器
實現應用程序的數據訪問層已經很麻煩了好一陣子。太多的樣板代碼必須被寫入。Domain classes,並無被設計成面向一個真正的對象或領域驅動的方式。框架
使用spring data jpa可以使豐富的Domain classes的持久性開發變得輕鬆不少,即便樣板代碼來實現存儲庫量特別仍是至關高的。因此Spring data jpa的目標是簡化關於各類持久存儲數據訪問層而努力。ide
備註:Domain classes 指的是POJO類,例如數據庫中有一張表:Student,那麼咱們會在程序中定義與之對應的Student.java,而這個Student.java就是屬於Domain classes。學習
Long story short, then, Spring Data JPA provides a definition to implement repositories that is supported under the hood by referencing the JPA specification, using the provider you define.spa
長話短說,Spring Data JPA 是在JPA規範的基礎下提供了Repository層的實現,可是使用那一款ORM須要你本身去決定。
個人理解是:雖然ORM框架都實現了JPA規範,可是在不一樣ORM框架之間切換是須要編寫的代碼有一些差別,而經過使用Spring Data Jpa可以方便你們在不一樣的ORM框架中間進行切換而不要更改代碼。而且Spring Data Jpa對Repository層封裝的很好,能夠省去很多的麻煩。
spring data jpa、jpa以及ORM框架之間的關係
實現JPA接口也並不意味着能夠替代Hibernate,Hibernate的索引功能,緩存功能並無相應的接口,因此有些時候仍是須要Hibernate的。可是!凡是JPA能實現的功能都用JPA來實現,以此來減小框架之間的耦合性。