Je comprends que JPA 2 est une spécification et qu'Hibernate est un outil pour ORM. Je comprends aussi qu'Hibernate a plus de fonctionnalités que JPA 2, mais d'un point de vue pratique, quelle est vraiment la différence ?
J'ai de l'expérience avec iBatis et j'essaie maintenant d'apprendre soit Hibernate, soit JPA2. J'ai pris le livre Pro JPA2 et il ne cesse de faire référence au "fournisseur JPA". Par exemple :
Si vous pensez qu'une fonctionnalité devrait être standardisée, vous devriez en parler et la demander à votre fournisseur JPA.
Tout cela m'embrouille et j'ai donc quelques questions à vous poser :
Comme vous le dites, JPA n'est qu'une spécification, ce qui signifie qu'il n'y a pas d'implémentation. Vous pouvez annoter vos classes autant que vous le souhaitez avec les annotations JPA, mais sans implémentation, rien ne se passera. Considérez JPA comme les directives à suivre ou une interface, tandis que l'implémentation JPA d'Hibernate est un code qui répond à l'API telle qu'elle est définie par la spécification JPA et fournit la fonctionnalité sous le capot.
Lorsque vous utilisez Hibernate avec JPA, vous utilisez en fait l'implémentation JPA d'Hibernate. L'avantage est que vous pouvez remplacer l'implémentation JPA d'Hibernate par une autre implémentation de la spécification JPA. Lorsque vous utilisez directement Hibernate, vous vous enfermez dans l'implémentation, car d'autres ORM peuvent utiliser des méthodes/configurations et annotations différentes, et vous ne pouvez donc pas passer à un autre ORM.
Pour une description plus détaillée, lisez mon [article de blog][1].
Extrait du [Wiki][1].
Motivation pour la création de l'API Java Persistence**.
De nombreux développeurs Java d'entreprise utilisent des objets persistants légers fournis par des frameworks open-source ou des objets d'accès aux données plutôt que des beans d'entité : les beans d'entité et les beans d'entreprise avaient la réputation d'être trop lourds et compliqués, et on ne pouvait les utiliser que dans les serveurs d'application Java EE. De nombreuses fonctionnalités des cadres de persistance tiers ont été intégrées à l'API Java Persistence et, depuis 2006, des projets tels que Hibernate (version 3.2) et Open-Source Version TopLink Essentials sont devenus des implémentations de l'API Java Persistence.
Comme indiqué dans la [page JCP][2], le lien Eclipse est l'implémentation de référence pour JPA. Consultez [cette réponse][3] pour en savoir plus.
JPA lui-même possède des caractéristiques qui constituent un cadre ORM standard. Puisque JPA fait partie de la spécification Java EE, vous pouvez utiliser JPA seul dans un projet et il devrait fonctionner avec tous les [serveurs compatibles Java EE][4]. Oui, ces serveurs auront les implémentations pour la spécification JPA.
Hibernate est le framework ORM le plus populaire, une fois que JPA a été introduit, Hibernate se conforme aux spécifications JPA. En dehors de l'ensemble des spécifications de base qu'il doit suivre, Hibernate fournit tout un tas de choses supplémentaires.
[1] : http://en.wikipedia.org/wiki/Java_Persistence_API [2] : http://jcp.org/aboutJava/communityprocess/final/jsr317/index.html [3] : https://stackoverflow.com/questions/4477082/what-is-a-jpa-implementation [4] : http://www.oracle.com/technetwork/java/javaee/overview/compatibility-jsp-136984.html
JPA est une spécification visant à normaliser les API ORM. Hibernate est un fournisseur d'une implémentation JPA. Donc, si vous utilisez JPA avec Hibernate, vous pouvez utiliser l'API JPA standard, Hibernate sera sous le capot, offrant quelques fonctions non standard. Voir http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/ et http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/