Hibernate與Jpa的關係,終於弄懂
原文連結:http://blog.sina.com.cn/s/blog_5f1619e80100yoxz.html
我知道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,很快發現了幾個問題:
- jpa中有Entity, Table,hibernate中也有,但是內容不同
- jpa中有Column,OneToMany等,Hibernate中沒有,也沒有替代品
我原以為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的即可”。