Hibernate與Jpa的關係

我知道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,很快發現了幾個問題:

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

我原以爲hibernate對jpa的支持,是另提供了一套專用於jpa的註解,但現在看起來似乎不是。一些重要的註解如Column,OneToMany等,hibernate沒有提供,這說明jpa的註解已經是hibernate的核心,hibernate只提供了一些補充,而不是兩套註解。要是這樣,hibernate對jpa的支持還真夠足量,我們要使用hibernate註解就必定要使用jpa。

實際情況是不是這樣?在被羣裏(Scala交流羣132569382)的朋友鄙視一番卻沒有給出滿意答案的時候,我又想起了萬能的stackoverflow,上去提了兩個問:

  1. http://stackoverflow.com/questions/8306742/if-i-want-to-use-hibernate-with-annotation-do-i-have-to-use-javax-persistence
  2. http://stackoverflow.com/questions/8306793/why-jpa-and-hibernate-both-have-entity-and-table-annotations

第一個是問如果想用hibernate註解,是不是一定會用到jpa的。網友的回答:“是。如果hibernate認爲jpa的註解夠用,就直接用。否則會弄一個自己的出來作爲補充”

第二個是問,jpa和hibernate都提供了Entity,我們應該用哪個,還是說可以兩個一起用?網友回答說“Hibernate的Entity是繼承了jpa的,所以如果覺得jpa的不夠用,直接使用hibernate的即可”。

tags: hibernate, jpa
posted in Java, 持久層 by Freewind

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章