原文地址: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,上去提了兩個問:
- http://stackoverflow.com/questions/8306742/if-i-want-to-use-hibernate-with-annotation-do-i-have-to-use-javax-persistence
- 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的即可”。