1. 程式人生 > >JPA和Hibernate關係之淺談

JPA和Hibernate關係之淺談

首先我們來看一下百度百科關於JPA的解釋,JPA全稱Java Persistence API。JPA通過JDK 5.0註解或XML描述物件-關係表的對映關係,並將執行期的實體物件持久化到資料庫中。JPA的總體思想和現有Hibernate、TopLink、JDO等ORM框架大體一致。總的來說,JPA包括以下3方面的技術:ORM對映元資料,API,查詢語言。由此可知,Jpa是一種規範,而Hibernate是它的一種實現。除了Hibernate,還有EclipseLink(曾經的toplink),OpenJPA等可供選擇,所以使用Jpa的一個好處是,可以多實現。但是我在play中定義Model時,使用的是jpa的annotations,比如javax.persistence.Entity, Table, Column, OneToMany等等。但它們提供的功能基礎,有時候想定義的更細一些,難免會用到Hibernate本身的annotation。

做專案要用到Hibernate。我想拋開JPA,直接使用hibernate的註解來定義Model,很快發現了幾個問題:

1:jpa中有Entity, Table,hibernate中也有,但是內容不同:2:jpa中有Column,OneToMany等,Hibernate中沒有,也沒有替JPA. 我原以為hibernate對jpa的支援,是另提供了一套專用於jpa的註解,但現在看起來似乎不是。一些重要的註解如Column, OneToMany等,hibernate沒有提供,這說明jpa的註解已經是hibernate的核心,hibernate只提供了一些補充,而不是兩 套註解。要是這樣,hibernate對jpa的支援還真夠足量,我們要使用hibernate註解就必定要使用jpa。 通過在stackoverflow上的提問 :如果我想使用hpaate與jpa,我必須使用一些“javax.persistence。*”註釋?
大家給出的答案滿意回答:

JPA規格 定義了javax.persistence包中的JPA註釋Hibernate不僅實現了JPA規範,而且擴充套件了它,增加了更多的功能。所以,hibernate建立自己的註釋,它們只是使用Hibernate功能來擴充套件JPA註釋,並將這些註釋放在包中org.hibernate.annotations

如果沒有為該JPA註釋(例如@OneToMany@ManyToOne新增指定的Hibernate特徵,Hibernate將不會在其org.hibernate.annotations包中進行註釋,javax.persistence並且必須根據JPA規範

使用這些 註釋。通常情況下,人們會使用JPA註釋,直到遇到需要使用hibernate功能的情況。

總的來說,JPA是規範,Hibernate是框架,JPA是持久化規範,而Hibernate實現了JPA。