Ich verstehe, dass JPA 2 eine Spezifikation und Hibernate ein Tool für ORM ist. Ich verstehe auch, dass Hibernate mehr Funktionen als JPA 2 bietet. Aber was ist aus praktischer Sicht wirklich der Unterschied?
Ich habe Erfahrung mit iBatis und versuche jetzt, entweder Hibernate oder JPA2 zu lernen. Ich habe das Pro JPA2-Buch aufgenommen und es bezieht sich immer wieder auf "JPA-Anbieter". Zum Beispiel:
Wenn Sie der Meinung sind, dass eine Funktion standardisiert werden sollte, sollten Sie sich bei Ihrem JPA-Anbieter melden
Das verwirrt mich und ich habe ein paar Fragen:
- Mit JPA2 allein kann ich Daten aus der Datenbank abrufen, indem ich einfach meine POJOs mit Anmerkungen versehen kann
- Soll JPA2 mit einem "JPA-Anbieter" verwendet werden, z. B. TopLink oder Hibernate? Wenn ja, welchen Vorteil hat 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 eine Referenz zu JPA2 zu sein (es wird erst in der späteren Hälfte des Buches in Abfragen aufgenommen). Gibt es ein Buch, das einen Problem- / Lösungsansatz für JPA2 verfolgt?
Antworten:
Wie Sie sagen, ist JPA nur eine Spezifikation, was bedeutet, dass es keine Implementierung gibt. Sie können Ihre Klassen mit JPA-Annotationen beliebig oft mit Anmerkungen versehen. Ohne eine Implementierung geschieht jedoch nichts. Stellen Sie sich JPA als die Richtlinien vor, die befolgt werden müssen, oder als Schnittstelle, während die JPA-Implementierung von Hibernate Code ist, der der in der JPA-Spezifikation definierten API entspricht und die Funktionalität unter der Haube bietet.
Wenn Sie Hibernate mit JPA verwenden, verwenden Sie tatsächlich die JPA-Implementierung von Hibernate. Dies hat den Vorteil, dass Sie die Implementierung von JPA durch Hibernate gegen eine andere Implementierung der JPA-Spezifikation austauschen können. Wenn Sie Straight Hibernate verwenden, sind Sie an die Implementierung gebunden, da andere ORMs möglicherweise andere Methoden / Konfigurationen und Anmerkungen verwenden. Daher können Sie nicht einfach zu einem anderen ORM wechseln.
Für eine detailliertere Beschreibung lesen Sie meinen Blogeintrag .
quelle
org.hibernate
Anmerkung verwenden. mehr dazuJPA ist der Tanz, Hibernate ist der Tänzer.
quelle
Einige 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 ausführen oder eine Lücke füllen, die nicht Teil des offiziellen JDK sind. Aus verschiedenen Gründen kann diese Funktion über das JCP (Java Community Process) Teil des Java JDK werden.
Hibernate (2003) bot eine Möglichkeit, SQL zu abstrahieren und Entwicklern zu ermöglichen, mehr über persistierende Objekte (ORM) nachzudenken. Sie benachrichtigen den Ruhezustand über Ihre Entitätsobjekte und es wird automatisch die Strategie generiert, diese beizubehalten. Hibernate stellte hierfür eine Implementierung und die API bereit, um die Implementierung entweder über die XML-Konfiguration oder über Anmerkungen zu steuern.
Das grundlegende Problem ist jetzt, dass Ihr Code eng mit einem bestimmten Anbieter (Hibernate) gekoppelt wird, für den viele Leute dachten, dass er allgemeiner sein sollte. Daher ist eine generische Persistenz-API erforderlich.
In der Zwischenzeit entwickelte das JCP mit vielen Beiträgen von Hibernate und anderen ORM-Tool-Anbietern JSR 220 (Java Specification Request), was zu JPA 1.0 (2006) und schließlich JSR 317 (JPA 2.0 (2009)) führte. Dies sind Spezifikationen einer generischen Java-Persistenz-API. Die API wird im JDK als eine Reihe von Schnittstellen bereitgestellt, sodass Ihre Klassen von der javax.persistence abhängen können und sich nicht um den bestimmten Anbieter kümmern müssen, der die Arbeit zum Speichern Ihrer Objekte ausführt. Dies ist nur die API und nicht die Implementierung. Der Ruhezustand wird nun zu einem der vielen Anbieter, die die JPA 2.0-Spezifikation implementieren. Sie können in Richtung JPA codieren und den für Ihre Anforderungen geeigneten ORM-Anbieter auswählen.
In einigen Fällen bietet Ihnen Hibernate möglicherweise Funktionen, die in JPA nicht kodifiziert sind. In diesem Fall können Sie eine Hibernate-spezifische Annotation direkt in Ihre Klasse einfügen, da JPA nicht die Schnittstelle dafür bereitstellt.
Quelle: http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/
quelle
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 zusammengestellt und so den Java Persistence API-Standard erstellt.
Eine Standard-Persistenz-API ist aus Client-Sicht sehr praktisch und macht es relativ einfach, eine Implementierung durch die andere zu wechseln (obwohl dies in der Praxis nicht so einfach ist, da Sie bei großen Projekten ohnehin bestimmte nicht standardmäßige Funktionen verwenden müssen). .
Die Standard-JPA hat die Java-ORM-Konkurrenz auf ein neues Niveau gebracht, und dies kann nur zu besseren Implementierungen führen.
Wie in meinem Buch "Hochleistungs-Java-Persistenz" erläutert , bietet Hibernate Funktionen, die von JPA noch nicht unterstützt werden :
@SQLInsert
,@SQLUpdate
,@SQLDelete
) Aussagen@FilterDef
,@Filter
,@Where
) und Entity - Filter (z@Where
)@Formula
)@Immutable
)FlushMode.MANUAL
,FlushMode.ALWAYS
)Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
)@OptimisticLock(excluded = true)
)OptimisticLockType.ALL
,OptimisticLockType.DIRTY
)@Where
,@Filter
)Mit diesen zusätzlichen Funktionen kann Hibernate viele Persistenzanforderungen erfüllen, die von großen Unternehmensanwendungen gefordert werden.
quelle
Aus dem Wiki .
Wie auf der JCP-Seite angegeben, ist der Eclipse-Link die Referenzimplementierung für JPA. Schauen Sie sich diese Antwort an, um mehr darüber zu erfahren.
JPA selbst verfügt über Funktionen, die ein Standard-ORM-Framework ausgleichen. Da JPA Teil der Java EE-Spezifikation ist, können Sie JPA allein in einem Projekt verwenden und es sollte mit allen Java EE-kompatiblen Servern funktionieren . Ja, diese Server verfügen über die Implementierungen für die JPA-Spezifikation.
Der Ruhezustand ist das beliebteste ORM- Framework, sobald der JPA eingeführt wurde. Der Ruhezustand entspricht den JPA- Spezifikationen. Abgesehen von den grundlegenden Spezifikationen, denen der Ruhezustand folgen sollte, werden viele zusätzliche Dinge bereitgestellt.
quelle
JPA ist nur eine Spezifikation, die konkret implementiert werden muss. Die Standard-Implementierungs-Oracle- Bereitstellung ist jetzt "Eclipselink". (Toplink wird von Oracle an die Eclipse Foundation gespendet, um mit Eclipselink zu fusionieren.)
(Referenz: http://www.oracle.com/technetwork/middleware/toplink/index-085257.html http://www.eclipse.org/org/press-release/20080317_Eclipselink.php )
Mit Eclipselink kann man sicher sein, dass der Code bei Bedarf auf jede Implementierung portierbar ist. Hibernate ist auch eine vollständige JPA-Implementierung + MEHR (Art von JPA Plus). Hibernate ist ein Super-Set von JPA mit einigen zusätzlichen Hibernate-spezifischen Funktionen. In Hibernate entwickelte App ist daher möglicherweise nicht kompatibel, wenn auf eine andere Implementierung umgestellt wird. Der Ruhezustand ist immer noch die Wahl der Mehrheit der Entwickler als JPA-Implementierung und weit verbreitet.
Eine weitere JPA-Implementierung ist OpenJPA (openjpa.apache.org), eine Erweiterung der Kodo-Implementierung.
quelle
JPA: ist wie eine Schnittstelle und hat keine konkrete Implementierung, um Funktionen zu verwenden, die in JPA vorhanden sind.
Ruhezustand: ist nur ein JPA-Anbieter , der die Funktionen in JPA implementiert hat und einige zusätzliche Funktionen haben kann, die in JPA möglicherweise nicht vorhanden sind.
TIPP: Sie können verwenden
Combo 1 : wird verwendet, wenn Sie das Gefühl haben, dass Ihr Ruhezustand keine bessere Leistung bietet und Sie den JPA-Anbieter ändern möchten, wenn Sie Ihren JPA nicht erneut schreiben müssen. Sie können einen anderen JPA-Anbieter schreiben ... und so oft wie möglich ändern.
Combo 2 : wird sehr wenig verwendet, wenn Sie Ihren JPA-Anbieter nicht um jeden Preis wechseln.
Besuchen Sie http://blog-tothought.rhcloud.com//post/2 , wo Ihre völlige Verwirrung deutlich wird.
quelle
JPA ist die Schnittstelle, Hibernate ist eine Implementierung dieser Schnittstelle.
quelle
JPA ist eine Spezifikation zur Standardisierung von ORM-APIs. Hibernate ist Anbieter einer JPA-Implementierung. Wenn Sie also JPA mit Ruhezustand verwenden, können Sie die Standard-JPA-API verwenden. Der Ruhezustand befindet sich unter der Haube und bietet einige weitere nicht standardmäßige Funktionen. Siehe http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/ und http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/
quelle
JPA ist nur eine Spezifikation. Auf dem Markt gibt es viele Anbieter, die JPA implementieren. Verschiedene Arten von Anbietern implementieren JPA auf unterschiedliche Weise. Verschiedene Anbietertypen bieten unterschiedliche Funktionen. Wählen Sie daher den richtigen Anbieter basierend auf Ihren Anforderungen.
Wenn Sie Hibernate oder einen anderen Anbieter anstelle von JPA verwenden, können Sie nicht einfach in den Ruhezustand zu EclipseLink oder OpenJPA in Hibernate wechseln. Wenn Sie jedoch JPA verwenden, müssen Sie lediglich die XML-Datei für die Persistenz ändern. Eine Migration ist daher in problemlos möglich JPA.
quelle
JPA ist eine API, die von Hibernate implementiert wird. Hibernate ist älter als JPA. Vor JPA schreiben Sie nativen Ruhezustandscode für Ihre ORM. JPA ist nur die Schnittstelle. Jetzt schreiben Sie JPA-Code und müssen eine Implementierung finden. Der Ruhezustand ist zufällig eine Implementierung.
Sie haben also folgende Möglichkeiten: Ruhezustand, Toplink usw.
Der Vorteil von JPA besteht darin, dass Sie Ihre Implementierung bei Bedarf austauschen können. Der Nachteil ist, dass die native API für den Ruhezustand / toplink / etc ... möglicherweise Funktionen bietet, die von der JPA-Spezifikation nicht unterstützt werden.
quelle
Während JPA die Spezifikation ist, ist Hibernate der Implementierungsanbieter, der die in der Spezifikation festgelegten Regeln befolgt.
quelle
Java - seine Unabhängigkeit ist nicht nur vom Betriebssystem, sondern auch vom Anbieter.
Daher Sie sollten Ihre Anwendung auf verschiedenen Anwendungsserver bereitstellen können. JPA ist auf jedem Java EE-kompatiblen Anwendungsserver implementiert und ermöglicht den Austausch von Anwendungsservern. Dann ändert sich jedoch auch die Implementierung. Eine Hibernate-Anwendung kann möglicherweise einfacher auf einem anderen Anwendungsserver bereitgestellt werden.
quelle
JPA ist eine Spezifikation, die Sie in Ihrer Datenschicht implementieren, um Datenbankoperationen, ODER-Zuordnungen und andere erforderliche Aufgaben auszuführen.
Da es sich nur um eine Spezifikation handelt , benötigen Sie ein Tool, um sie implementieren zu können. Dieses Tool kann entweder Hibernate, TopLink, iBatis, Spring-Data usw. sein.
Sie benötigen nicht unbedingt JPA, wenn Sie den Ruhezustand in Ihrer Datenschicht verwenden. Wenn Sie jedoch die JPA-Spezifikation für den Ruhezustand verwenden, wird der Wechsel zu anderen ORM-Tools wie iBatis und TopLink in Zukunft einfacher, da die Spezifikation auch für andere gilt.
* ( Wenn Sie sich erinnern,
import javax.persistence.*;
wenn Sie Anmerkungen für die ODER-Zuordnung (wie @Id, @Column, @GeneratedValue usw.) im Ruhezustand verwenden, können Sie dort JPA unter Ruhezustand verwenden. Sie können die @Query- und andere Funktionen von JPA als verwenden gut )quelle
JPA ist eine Java-API-Spezifikation, die die Verwaltung relationaler Daten in Anwendungen mit Java Platform beschreibt. Dabei ist als Ruhezustand eine ORM-Bibliothek (Object Relational Mapping), die der JPA-Spezifikation folgt.
Sie können sich JPA als eine Reihe von Regeln vorstellen, die von Hibernate implementiert werden.
quelle
JPA ist JSR, dh Java-Spezifikationsanforderung zum Implementieren der objektrelationalen Zuordnung, für deren Implementierung kein spezifischer Code vorhanden ist. Es definiert bestimmte Regeln für den Zugriff auf, das Speichern und Verwalten der Daten zwischen Java-Objekten und der relationalen Datenbank. Mit seiner Einführung wurde EJB ersetzt, da es von der Java-Entwicklergemeinde als schwergewichtig kritisiert wurde. Der Ruhezustand ist eine der Möglichkeiten, wie JPA mithilfe der Richtlinien implementiert werden kann. Der Ruhezustand ist ein leistungsstarker Objekt- / relationaler Persistenz- und Abfragedienst, der unter der Open-Source-Lizenz GNU Lesser General Public License (LGPL) lizenziert ist. Der Vorteil davon ist, dass Sie kann die Implementierung von JPA durch Hibernate gegen eine andere Implementierung der JPA-Spezifikation austauschen.
quelle
JPA ist nur eine Spezifikation, die konkret implementiert werden muss. Die von Oracle bereitgestellte Standardimplementierung ist jetzt "Eclipselink". Toplink wird von Oracle an die Eclipse Foundation gespendet, um mit eclipselink zu fusionieren.
Mit Eclipselink kann man sicher sein, dass der Code bei Bedarf auf jede Implementierung portierbar ist. Hibernate ist auch eine vollständige JPA-Implementierung + MEHR. Hibernate ist ein Super-Set von JPA mit einigen zusätzlichen Hibernate-spezifischen Funktionen. In Hibernate entwickelte Anwendungen sind daher möglicherweise nicht kompatibel, wenn sie auf eine andere Implementierung umgestellt werden. Der Ruhezustand ist immer noch die Wahl der Mehrheit der Entwickler als JPA-Implementierung und weit verbreitet.
Eine weitere JPA-Implementierung ist OpenJPA, eine Erweiterung der Kodo-Implementierung.
JPA gegen Ruhezustand
quelle
Ich versuche es mit sehr einfachen Worten zu erklären.
Angenommen, Sie benötigen ein Auto, da wir alle wissen, dass es mehrere Hersteller der A-Klasse wie MERCEDES, BMW, AUDI usw. gibt.
Jetzt in der obigen Aussage CAR (ist eine Spezifikation), da jedes Auto gemeinsame Merkmale wie etwas mit 4 Rädern hat und auf der Straße gefahren werden kann, ist Auto ... also ist es wie JPA. Und MERCEDES, BMW, AUDI usw. verwenden nur gemeinsame Fahrzeugfunktionen und fügen Funktionen entsprechend ihrer Kundenbasis hinzu, damit sie die Fahrzeugspezifikationen wie Ruhezustand, iBATIS usw. implementieren.
Durch diese gemeinsamen Funktionen geht jpa und der Ruhezustand ist nur eine Implementierung entsprechend ihrem jboss-Bedarf.
1 weitere Sache
JPA enthält einige grundlegende Eigenschaften. Wenn Sie also in Zukunft den Ruhezustand auf eine andere Implementierung ändern möchten, können Sie problemlos ohne große Kopfschmerzen wechseln. Für diese grundlegenden Eigenschaften sind JPA-Anmerkungen enthalten, die für jede Implementierungstechnologie, JPQL-Abfragen, geeignet sind.
Daher implementieren wir hauptsächlich den Ruhezustand mit JPA-Technologie, nur für den Fall, dass wir unsere Implementierung entsprechend den Kundenanforderungen ändern möchten. Außerdem schreiben Sie weniger Code, da einige allgemeine Funktionen in JPA enthalten sind. Wenn jemand immer noch nicht klar ist, können Sie den Stapelüberlauf als neu kommentieren.
Vielen Dank
quelle
JPA ist nur eine Spezifikation, während Hibernate einer der JPA-Anbieter ist, dh Hibernate implementiert verschiedene im JPA-Vertrag erwähnte Dinge.
quelle
Die JPA- oder Java-Persistenz-API ist eine Standardspezifikation für ORM-Implementierungen, während Hibernate die eigentliche ORM-Implementierung oder das eigentliche ORM-Framework ist.
quelle
JPA ist die Java Persistence API. Womit nur die Spezifikationen für APIs angegeben werden. Bedeutet, dass die Regeln und Richtlinien zum Erstellen der APIs. Wenn ein anderer Kontext angegeben ist, handelt es sich um eine Reihe von Standards, die den Wrapper zum Erstellen dieser APIs bereitstellen und für den Zugriff auf Entitätsobjekte aus der Datenbank verwendet werden können. JPA wird von oracle bereitgestellt. Wenn wir auf die Datenbank zugreifen wollen, müssen wir diese unbedingt implementieren. Mittel JPA gibt nur Richtlinien für die Implementierung von APIs an. Hibernate ist ein JPA-Anbieter / Anbieter, der für die Implementierung dieser APIs verantwortlich ist. Wie Hibernate TopLink und Open JPA sind einige Beispiele für JPA-API-Anbieter. Daher verwenden wir JPA-spezifizierte Standard-APIs im Ruhezustand.
quelle
Im übertragenen Sinne ist JPA nur eine Schnittstelle, Hibernate / TopLink - Klasse (dh Schnittstellenimplementierung).
Sie müssen über eine Schnittstellenimplementierung verfügen, um die Schnittstelle verwenden zu können. Sie können die Klasse jedoch über die Schnittstelle verwenden, dh den Ruhezustand über die JPA-API verwenden, oder Sie können die Implementierung direkt verwenden, dh den Ruhezustand direkt verwenden, nicht über die reine JPA-API.
Ein gutes Buch über JPA ist "High-Performance Java Persistence" von Vlad Mihalcea.
quelle