JPA Java Persistence API,是Java EE 5的標準ORM接口,也是ejb3規範的一部分。java
Hibernate,當今很流行的ORM框架,是JPA的一個實現,可是其功能是JPA的超集。框架
JPA和Hibernate之間的關係,能夠簡單的理解爲JPA是標準接口,Hibernate是實現。那麼Hibernate是如何實現與JPA的這種關係的呢。Hibernate主要是經過三個組件來實現的,及hibernate-annotation、hibernate-entitymanager和hibernate-core。spa
hibernate-annotation是Hibernate支持annotation方式配置的基礎,它包括了標準的JPA annotation以及Hibernate自身特殊功能的annotation。hibernate
hibernate-core是Hibernate的核心實現,提供了Hibernate全部的核心功能。繼承
hibernate-entitymanager實現了標準的JPA,能夠把它當作hibernate-core和JPA之間的適配器,它並不直接提供ORM的功能,而是對hibernate-core進行封裝,使得Hibernate符合JPA的規範。接口
Jpa是一種規範,而Hibernate是它的一種實現。除了Hibernate,還有EclipseLink(曾經的toplink),OpenJPA等可供選擇,因此使用Jpa的一個好處是,能夠更換實現而沒必要改動太多代碼。ip
在play中定義Model時,使用的是jpa的annotations,好比javax.persistence.Entity, Table, Column, OneToMany等等。但它們提供的功能基礎,有時候想定義的更細一些,不免會用到Hibernate自己的annotation。我當時想,jpa這麼弱還要用它幹什麼,爲何不直接使用hibernate的?反正我又不會換成別的實現。get
由於我很快決定再也不使用hibernate,這個問題就一直放下了。直到我如今在新公司,作項目要用到Hibernate。it
我想拋開jpa,直接使用hibernate的註解來定義Model,很快發現了幾個問題:io
我原覺得hibernate對jpa的支持,是另提供了一套專用於jpa的註解,但如今看起來彷佛不是。一些重要的註解如Column, OneToMany等,hibernate沒有提供,這說明jpa的註解已是hibernate的核心,hibernate只提供了一些補充,而不是兩套註解。要是這樣,hibernate對jpa的支持還真夠足量,咱們要使用hibernate註解就一定要使用jpa。
實際狀況是否是這樣?在被羣裏(Scala交流羣132569382)的朋友鄙視一番卻沒有給出滿意答案的時候,我又想起了萬能的stackoverflow,上去提了兩個問:
第一個是問若是想用hibernate註解,是否是必定會用到jpa的。網友的回答:「是。若是hibernate認爲jpa的註解夠用,就直接用。不然會弄一個本身的出來做爲補充」
第二個是問,jpa和hibernate都提供了Entity,咱們應該用哪一個,仍是說能夠兩個一塊兒用?網友回答說「Hibernate的Entity是繼承了jpa的,因此若是以爲jpa的不夠用,直接使用hibernate的便可」。