Question Quelle est la différence entre JPA et Hibernate? [fermé]


Je comprends que JPA 2 est une spécification et Hibernate est un outil pour ORM. Aussi, je comprends que Hibernate a plus de fonctionnalités que JPA 2. Mais d'un point de vue pratique, quelle est la différence?

J'ai de l'expérience avec iBatis et maintenant j'essaie d'apprendre Hibernate ou JPA2. J'ai pris le livre Pro JPA2 et il ne cesse de se référer à "fournisseur JPA". Par exemple:

Si vous pensez qu'une fonctionnalité devrait être standardisée, vous devriez parler   et demandez-le à votre fournisseur JPA

Cela me confond donc j'ai quelques questions:

  • En utilisant JPA2 seul, puis-je récupérer des données à partir de DB en annotant simplement mes POJO?
  • JPA2 est-il supposé être utilisé avec un "fournisseur JPA", par exemple TopLink ou Hibernate? Si oui, alors quel est l'avantage d'utiliser JPA2 + Hibernate par rapport à JPA2 seul, ou comparé à Hibernate seul?
  • Pouvez-vous recommander un bon livre pratique JPA2. "Pro JPA2" ressemble plus à une bible et à une référence sur JPA2 (il ne va pas dans les requêtes jusqu'à la dernière moitié du livre). Y a-t-il un livre qui pose une approche problème / solution à JPA2?

682
2018-03-27 00:04


origine


Réponses:


Comme vous le dites, JPA n'est qu'une spécification, ce qui signifie qu'il n'y a pas de mise en œuvre. Vous pouvez annoter vos classes autant que vous le souhaitez avec les annotations JPA, mais sans une implémentation, rien ne se passera. Pensez à JPA comme les lignes directrices qui doivent être suivies ou une interface, tandis que l'implémentation JPA de Hibernate est le code qui répond à l'API tel que défini par la spécification JPA et fournit la fonctionnalité sous le capot.

Lorsque vous utilisez Hibernate avec JPA, vous utilisez réellement l'implémentation Jib Hibernate. L'avantage est que vous pouvez échanger l'implémentation de JPA d'Hibernate pour une autre implémentation de la spécification JPA. Lorsque vous utilisez Hibernate directement, vous vous verrouillez dans l'implémentation car d'autres ORM peuvent utiliser des méthodes / configurations et des annotations différentes, vous ne pouvez donc pas simplement passer à un autre ORM.

Pour une description plus détaillée, lisez mon entrée de blog.


777
2018-03-27 00:08



JPA est la danse, Hibernate est la danseuse.


634
2018-02-03 17:25



Certaines choses sont trop difficiles à comprendre sans une perspective historique du langage et de la compréhension du JCP.

Souvent, il existe des tiers qui développent des packages remplissant une fonction ou remplissant un espace qui ne fait pas partie du JDK officiel. Pour diverses raisons, cette fonction peut faire partie du Java JDK via le JCP (Java Community Process)

Hibernate (en 2003) a fourni un moyen d'abstraire SQL et de permettre aux développeurs de réfléchir davantage en termes d'objets persistants (ORM). Vous notifiez hibernate à propos de vos objets Entity et il génère automatiquement la stratégie pour les persister. Hibernate a fourni une implémentation pour cela et l'API pour piloter l'implémentation via la configuration XML ou les annotations.

Le problème fondamental est maintenant que votre code devient étroitement associé à un fournisseur spécifique (Hibernate) pour ce que beaucoup de gens pensent devrait être plus générique. D'où le besoin d'une API de persistance générique.

Pendant ce temps, le JCP avec beaucoup d'apport d'Hibernate et d'autres fournisseurs d'outils ORM développait JSR 220 (Java Specification Request) qui a abouti à JPA 1.0 (2006) et finalement à JSR 317 qui est JPA 2.0 (2009). Ce sont les spécifications d'une API Java Persistence générique. L'API est fournie dans le JDK sous la forme d'un ensemble d'interfaces afin que vos classes puissent dépendre de la javax.persistence et ne pas se soucier du fournisseur particulier qui fait le travail de la persistance de vos objets. C'est seulement l'API et non l'implémentation. Hibernate devient l'un des nombreux fournisseurs qui implémentent la spécification JPA 2.0. Vous pouvez coder vers JPA et choisir n'importe quel fournisseur ORM conforme à vos besoins.

Il y a des cas où Hibernate peut vous donner des fonctionnalités qui ne sont pas codifiées dans JPA. Dans ce cas, vous pouvez choisir d'insérer une annotation spécifique à Hibernate directement dans votre classe puisque JPA ne fournit pas l'interface pour faire cela.

La source: http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/


158
2018-02-24 16:56



JPA est l'interface tandis que Hibernate est l'implémentation.

Traditionnellement, il y a eu plusieurs solutions Java ORM:

chaque implémentation définissant sa propre définition de mappage ou API client. Le groupe d'experts JPA a rassemblé le meilleur de tous ces outils et ils ont donc créé la norme Java Persistence API.

Une API de persistance standard est très pratique du point de vue du client, ce qui en fait relativement il est facile de passer d'une implémentation à l'autre (même si en pratique ce n'est pas si simple, car sur de grands projets, vous devrez utiliser des fonctionnalités spécifiques non standard).

La norme JPA a poussé la concurrence Java ORM à un nouveau niveau et cela ne peut que conduire à de meilleures implémentations.

Comme expliqué dans mon livre, la persévérance Java haute performance, Hibernate offre des fonctionnalités qui ne sont pas encore supportées par JPA:

Ces fonctionnalités supplémentaires permettent à Hibernate de répondre à de nombreuses exigences de persistance exigées par les grandes applications d'entreprise.


100
2017-11-09 07:11



Du Wiki.

Motivation pour la création de l'API Java Persistence

De nombreux développeurs Java d'entreprise utilisent des objets légers persistants fournis par des frameworks Open Source ou des objets Data Access à la place des beans entité: les beans entité et enterprise beans ont la réputation d'être trop lourds et compliqués. De nombreuses fonctionnalités des frameworks de persistance tiers ont été intégrées dans l'API Java Persistence, et à partir de 2006, des projets comme Hibernate (version 3.2) et Open-Source Version TopLink Essentials sont devenus des implémentations de l'API Java Persistence.

Comme dit dans le Page JCP le lien Eclipse est l'implémentation de référence pour JPA. A regarder cette réponse pour un peu plus sur cela.

JPA lui-même a des caractéristiques qui vont compenser pour un cadre ORM standard. Puisque JPA fait partie de Java EE spec, vous pouvez utiliser JPA seul dans un projet et il devrait fonctionner avec n'importe quel Serveurs compatibles Java EE. Oui, ces serveurs auront les implémentations pour la spécification JPA.

Hibernate est le plus populaire ORM cadre, une fois le JPA a été introduit Hibernate conforme à la JPA Caractéristiques. En dehors de l'ensemble de spécifications de base qu'il devrait suivre Hibernate fournit beaucoup de choses supplémentaires.


58
2018-03-27 03:29



Hibernate est un fournisseur JPA.

La page JPA Vs Hibernate par Krishna Srinivasan dit:

JPA est une spécification d'accès, de conservation et de gestion des données entre les objets Java et la base de données relationnelle. Comme la définition dit son API, c'est seulement la spécification. Il n'y a pas d'implémentation pour l'API. JPA spécifie l'ensemble de règles et de directives pour développer les interfaces qui suivent la norme. Directement au point: JPA est juste des lignes directrices pour implémenter l'Object Relational Mapping (ORM) et il n'y a pas de code sous-jacent pour l'implémentation.   Où, comme Hibernate est la mise en œuvre effective des lignes directrices JPA. Lorsque Hibernate implémente la spécification JPA, celle-ci sera certifiée par le groupe JPA en suivant toutes les normes mentionnées dans la spécification. Par exemple, les directives de l'APP fourniraient des informations sur les caractéristiques obligatoires et facultatives à mettre en œuvre dans le cadre de la mise en œuvre de l'APP.


20
2017-09-12 10:38



L'APP n'est qu'une spécification qui nécessite une mise en œuvre concrète. le implémentation par défaut Oracle fournir est "Eclipselink" maintenant. (Toplink est donné par Oracle à la fondation Eclipse pour fusionner avec eclipselink)

(Référence : http://www.oracle.com/technetwork/middleware/toplink/index-085257.html http://www.eclipse.org/org/press-release/20080317_Eclipselink.php )

En utilisant Eclipselink, on peut être sûr que le code est portable pour n'importe quelle implémentation si besoin est. Hibernate est également une implémentation JPA complète + MORE (sorte de JPA Plus). Hibernate est un super ensemble de JPA avec quelques fonctionnalités supplémentaires spécifiques à Hibernate. Ainsi, l'application développée dans Hibernate peut ne pas être compatible avec d'autres implémentations. Toujours hiberner est le choix de la majorité des développeurs en tant que mise en œuvre JPA et largement utilisé.

Une autre implémentation de JPA est OpenJPA (openjpa.apache.org) qui est une extension de l'implémentation de Kodo.


16
2017-11-29 07:23



JPA: est juste comme un interface et n'ont pas de mise en œuvre concrète pour utiliser les fonctions qui existent dans l'APP.

Hibernate: est juste un Fournisseur JPA qui ont la mise en œuvre des fonctions dans JPA et peuvent avoir des fonctions supplémentaires qui pourraient ne pas être là dans JPA.

CONSEIL: vous pouvez utiliser

     *combo 1* : JPA + JPA Provider(Hibernate) 
     *combo 2* : only Hiberante which does not need any interface 

Combo 1 : est utilisé lorsque vous sentez que votre hibernation ne donne pas de meilleures performances et que vous voulez changer de fournisseur JPA lorsque vous n'avez plus besoin d'écrire votre JPA. Vous pouvez écrire un autre fournisseur JPA ... et vous pouvez changer autant de fois que vous le pouvez.

Combo 2 : est utilisé très moins comme lorsque vous ne changez pas votre fournisseur JPA à tout prix.

Visite http://blog-tothought.rhcloud.com//post/2, où votre confusion complète deviendra claire.


15
2017-08-03 09:06



JPA est l'interface, Hibernate est une implémentation de cette interface.


11
2018-04-21 13:09



JPA est une spécification pour standardiser 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 plus. Voir http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/ et http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/


10
2018-03-27 03:51



JPA est juste une spécification. Sur le marché, il existe de nombreux fournisseurs qui implémente JPA. Différents types de fournisseurs implémentent JPA de manière différente. donc différents types de fournisseurs offrent des fonctionnalités différentes, alors choisissez un fournisseur approprié en fonction de vos besoins.

Si vous utilisez Hibernate ou tout autre fournisseur à la place de JPA, vous ne pouvez pas facilement passer en mode Hibernate à EclipseLink ou OpenJPA à Hibernate.But Si vous utilisez JPA, il vous suffit de modifier le fichier XML de persistance. JPA.


5
2018-04-08 08:41