678 Stimmen

Was ist der Unterschied zwischen JPA und Hibernate?

Ich verstehe, dass JPA 2 eine Spezifikation und Hibernate ein Werkzeug für ORM ist. Ich verstehe auch, dass Hibernate mehr Funktionen hat als JPA 2. Aber was ist aus praktischer Sicht wirklich der Unterschied?

Ich habe Erfahrung mit iBatis und jetzt versuche ich, entweder Hibernate oder JPA2 zu lernen. Ich habe das Buch Pro JPA2 in die Hand genommen und es verweist immer wieder auf den "JPA-Provider". Zum Beispiel:

Wenn Sie der Meinung sind, dass eine Funktion standardisiert werden sollte, sollten Sie sich zu Wort melden. und fordern Sie sie bei Ihrem JPA-Anbieter an

Das verwirrt mich, deshalb habe ich ein paar Fragen:

  • Mit JPA2 allein kann ich Daten aus der DB abrufen, indem ich einfach meine POJOs annotiere
  • Soll JPA2 mit einem "JPA-Provider", z. B. TopLink oder Hibernate, verwendet werden? Wenn ja, welche Vorteile bietet die Verwendung von JPA2 + Hibernate im Vergleich zu JPA2 allein oder im Vergleich zu Hibernate allein?
  • Können Sie ein gutes praktisches JPA2-Buch empfehlen? "Pro JPA2" scheint eher eine Bibel und ein Nachschlagewerk für JPA2 zu sein (es geht erst in der zweiten Hälfte des Buches auf Abfragen ein). Gibt es ein Buch, das einen Problem/Lösungsansatz für JPA2 bietet?

776voto

Kevin Bowersox Punkte 90706

Wie Sie sagen, ist JPA nur eine Spezifikation, d.h. es gibt keine Implementierung. Sie können Ihre Klassen so viel mit JPA-Annotationen versehen, wie Sie möchten, aber ohne eine Implementierung wird nichts passieren. Stellen Sie sich JPA als die Richtlinien vor, die befolgt werden müssen, oder als eine Schnittstelle, während die JPA-Implementierung von Hibernate der Code ist, der die API erfüllt, wie sie in der JPA-Spezifikation definiert ist, und die Funktionalität unter der Haube bietet.

Wenn Sie Hibernate mit JPA verwenden, verwenden Sie eigentlich die Hibernate JPA-Implementierung. Dies hat den Vorteil, dass Sie die Hibernate-Implementierung von JPA gegen eine andere Implementierung der JPA-Spezifikation austauschen können. Wenn Sie nur Hibernate verwenden, sind Sie an die Implementierung gebunden, da andere ORMs möglicherweise andere Methoden/Konfigurationen und Anmerkungen verwenden und Sie daher nicht einfach zu einem anderen ORM wechseln können.

Für eine detailliertere Beschreibung lesen Sie meine Blogeintrag .

630voto

johnm Punkte 7316

JPA ist der Tanz, Hibernate ist der Tänzer.

158voto

Ken Block Punkte 3373

Manche Dinge sind ohne eine historische Perspektive der Sprache und des Verständnisses der JCP zu schwer zu verstehen.

Oft gibt es Dritte, die Pakete entwickeln, die eine Funktion erfüllen oder eine Lücke füllen, die nicht Teil des offiziellen JDK ist. Aus verschiedenen Gründen kann diese Funktion durch den JCP (Java Community Process) Teil des Java JDK werden

Hibernate (2003) bot eine Möglichkeit, SQL zu abstrahieren und es Entwicklern zu ermöglichen, mehr in Bezug auf die Persistenz von Objekten zu denken (ORM). Sie teilen Hibernate Ihre Entity-Objekte mit, und Hibernate generiert automatisch die Strategie für deren Persistierung. Hibernate bietet eine entsprechende Implementierung und die API, um die Implementierung entweder über XML-Konfiguration oder Anmerkungen zu steuern.

Das grundsätzliche Problem besteht nun darin, dass Ihr Code eng an einen bestimmten Anbieter (Hibernate) gekoppelt ist, und zwar für etwas, von dem viele Leute dachten, dass es allgemeiner sein sollte. Daher die Notwendigkeit für eine generische Persistenz-API.

In der Zwischenzeit entwickelte das JCP unter Mitwirkung von Hibernate und anderen Anbietern von ORM-Tools JSR 220 (Java Specification Request), aus dem JPA 1.0 (2006) und schließlich JSR 317 (JPA 2.0, 2009) hervorgingen. Dabei handelt es sich um Spezifikationen für eine generische Java Persistence API. Die API wird im JDK als eine Reihe von Schnittstellen bereitgestellt, so dass Ihre Klassen von javax.persistence abhängen können und sich nicht um den jeweiligen Anbieter kümmern müssen, der die Persistenz Ihrer Objekte sicherstellt. Dabei handelt es sich nur um die API und nicht um die Implementierung. Hibernate ist nun einer der vielen Anbieter, die die JPA 2.0-Spezifikation implementieren. Sie können in Richtung JPA programmieren und den ORM-Anbieter wählen, der Ihren Anforderungen entspricht.

Es gibt Fälle, in denen Hibernate Ihnen Funktionen bietet, die in JPA nicht kodifiziert sind. In diesem Fall können Sie eine Hibernate-spezifische Annotation direkt in Ihre Klasse einfügen, da JPA keine Schnittstelle für diese Funktion bietet.

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

100voto

Vlad Mihalcea Punkte 121171

JPA ist die Schnittstelle, während Hibernate die Implementierung ist.

Traditionell gab es mehrere Java ORM-Lösungen:

Jede Implementierung definiert ihre eigene Mapping-Definition oder Client-API. Die JPA-Expertengruppe hat das Beste aus all diesen Tools zusammengetragen und so den Java Persistence API-Standard geschaffen.

Eine Standard-API für die Persistenz ist aus Sicht des Kunden sehr praktisch und macht es relativ Es ist einfach, die eine Implementierung durch die andere zu ersetzen (obwohl es in der Praxis nicht so einfach ist, da man bei großen Projekten ohnehin bestimmte nicht standardisierte Funktionen verwenden muss).

Der Standard JPA hat den Wettbewerb unter den Java ORMs auf ein neues Niveau gehoben, was nur zu besseren Implementierungen führen kann.

Wie erklärt in mein Buch, Java-Persistenz mit hoher Leistung , Hibernate bietet Funktionen, die von JPA noch nicht unterstützt werden :

Mit diesen zusätzlichen Funktionen kann Hibernate viele Persistenzanforderungen erfüllen, die von großen Unternehmensanwendungen verlangt werden.

57voto

ManuPK Punkte 11403

De la Wiki .

Motivation für die Entwicklung der Java Persistence API

Viele Enterprise-Java-Entwickler verwenden leichtgewichtige persistente Objekte, die von Open-Source-Frameworks oder Data Access Objects bereitgestellt werden, anstelle von Entity Beans: Entity Beans und Enterprise Beans hatten den Ruf, zu schwergewichtig und kompliziert zu sein, und man konnte sie nur in Java EE-Anwendungsservern verwenden. Viele der Funktionen der Persistenz-Frameworks von Drittanbietern wurden in die Java Persistence API aufgenommen, und seit 2006 sind Projekte wie Hibernate (Version 3.2) und die Open-Source-Version TopLink Essentials zu Implementierungen der Java Persistence API geworden.

Wie in der JCP-Seite der Eclipse-Link ist die Referenzimplementierung für JPA. Schauen Sie sich 本答 um mehr darüber zu erfahren.

JPA selbst verfügt über Funktionen, die ein Standard-ORM-Framework ausmachen. Da JPA ein Teil der Java EE-Spezifikation ist, können Sie JPA allein in einem Projekt verwenden und es sollte mit jeder Java EE-kompatible Server . Ja, diese Server verfügen über die Implementierungen für die JPA-Spezifikation.

Hibernate ist die beliebteste ORM Rahmen, sobald die JPA eingeführt wurde, entspricht hibernate dem JPA Spezifikationen. Abgesehen von den grundlegenden Spezifikationen, die es befolgen sollte, bietet hibernate eine ganze Reihe zusätzlicher Dinge.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X