Der Unterschied zwischen JPA, Hibernate und EclipseLink

1. Einleitung

In diesem Tutorial werden wir den Ruhezustand und die Java Persistence API (JPA) diskutieren - mit einem Schwerpunkt auf den Unterschieden zwischen ihnen.

Wir werden zunächst untersuchen, was JPA ist, wie es verwendet wird und welche Kernkonzepte dahinter stehen.

Dann schauen wir uns an, wie Hibernate und EclipseLink in das Bild passen.

2. Objektrelationale Zuordnung

Bevor wir uns mit JPA befassen, ist es wichtig, das Konzept der objektrelationalen Zuordnung - auch als ORM bekannt - zu verstehen.

Bei der objektrelationalen Zuordnung wird einfach jedes Java-Objekt direkt in einer Datenbanktabelle gespeichert . Normalerweise wird der Name des Objekts, das beibehalten wird, zum Namen der Tabelle, und jedes Feld in diesem Objekt wird zu einer Spalte. Wenn die Tabelle eingerichtet ist, entspricht jede Zeile einem Datensatz in der Anwendung.

3. Eine Einführung in JPA

Die Java Persistence API (JPA) ist eine Spezifikation, die die Verwaltung relationaler Daten in einer Java-Anwendung definiert. Die API ordnet eine Reihe von Konzepten zu, die definieren, welche Objekte in der Anwendung beibehalten werden sollen und wie sie beibehalten werden sollen.

Hierbei ist zu beachten, dass JPA nur eine Spezifikation ist und dass eine Implementierung erforderlich ist, um zu funktionieren - aber dazu später mehr.

Lassen Sie uns nun einige der wichtigsten JPA-Konzepte diskutieren, die eine Implementierung abdecken muss.

3.1. Entität

Die Klasse javax.persistence.Entity definiert, welche Objekte in der Datenbank beibehalten werden sollen . Für jede persistierte Entität erstellt JPA eine neue Tabelle in der ausgewählten Datenbank.

Darüber hinaus sollten alle ausgewählten Entitäten einen Primärschlüssel definieren, der durch die Annotation @Id gekennzeichnet ist . Zusammen mit der Annotation @GeneratedValue definieren wir, dass der Primärschlüssel automatisch generiert werden soll, wenn der Datensatz in der Datenbank beibehalten wird.

Schauen wir uns ein kurzes Beispiel einer von JPA beschriebenen Entität an.

@Entity public class Car { @GeneratedValue @Id public long id; // getters and setters } 

Denken Sie daran, dass dies derzeit keine Auswirkungen auf die Anwendung hat. JPA stellt keinen Implementierungscode bereit.

3.2. Feldpersistenz

Ein weiteres Kernkonzept von JPA ist die Feldpersistenz . Wenn ein Objekt in Java als Entität definiert ist, werden alle darin enthaltenen Felder automatisch als unterschiedliche Spalten in der Entitätstabelle beibehalten.

Wenn sich in einem persistierten Objekt ein Feld befindet, das nicht in der Datenbank persistiert werden soll, können wir das Feld mit der Annotation @Transient als transient deklarieren .

3.3. Beziehungen

Als Nächstes gibt JPA an, wie die Beziehungen zwischen verschiedenen Datenbanktabellen in unserer Anwendung verwaltet werden sollen. Wie wir gesehen haben, behandelt JPA dies mit Anmerkungen. Es gibt vier Beziehungsanmerkungen, die wir berücksichtigen müssen:

  1. @Eins zu eins
  2. @ OneToMany
  3. @ManyToOne
  4. @Viel zu viel

Schauen wir uns an, wie das funktioniert:

@Entity public class SteeringWheel { @OneToOne private Car car // getters and setters }

In unserem obigen Beispiel beschreibt die SteeringWheel- Klasse eine Eins-zu-Eins-Beziehung zu unserer Car- Klasse von früher.

3.4. Entity Manager

Schließlich gibt die Klasse javax.persistence.EntityManager Operationen zur und von der Datenbank an. Der EntityManager enthält allgemeine CRUD-Vorgänge (Create, Read, Update and Delete) , die in der Datenbank beibehalten werden.

4. JPA-Implementierungen

Da die JPA-Spezifikation definiert, wie und was beibehalten werden soll, müssen wir jetzt einen Implementierungsanbieter auswählen, der den erforderlichen Code bereitstellt . Ohne einen solchen Anbieter müssten wir alle relevanten Klassen implementieren, um mit JPA übereinzustimmen, und das ist eine Menge Arbeit!

Es stehen zahlreiche Anbieter zur Auswahl, von denen jeder seine eigenen Vor- und Nachteile aufweist. Bei der Entscheidung für die Verwendung sollten einige der folgenden Punkte berücksichtigt werden :

  1. Projektreife - wie lange gibt es den Anbieter schon und wie gut ist er dokumentiert?
  2. Teilprojekte - Hat der Anbieter nützliche Teilprojekte für unsere neue Anwendung?
  3. Community-Unterstützung - Gibt es jemanden, der uns hilft, wenn wir einen kritischen Fehler haben ?
  4. Benchmarking - wie performant ist die Implementierung?

Während wir uns nicht eingehend mit dem Benchmarking verschiedener JPA-Anbieter befassen, enthält der JPA Performance Benchmark (JPAB) wertvolle Erkenntnisse dazu.

Lassen Sie uns einen kurzen Blick auf einige der Top-Anbieter von JPA werfen.

5. Ruhezustand

Hibernate ist im Kern ein objektrelationales Mapping-Tool, das eine Implementierung von JPA bietet . Hibernate ist eine der ausgereiftesten JPA-Implementierungen , die von einer riesigen Community unterstützt wird.

Es implementiert die gesamte javax.persistenceKlassen, die wir uns weiter oben in diesem Artikel angesehen haben, sowie Funktionen, die über JPA hinausgehen - Tools für den Ruhezustand, Validierung und Suche. Obwohl diese Hibernate-spezifischen APIs nützlich sein können, werden sie in Anwendungen, die nur die Basis-JPA-Funktionalität erfordern, nicht benötigt.

Lassen Sie uns einen kurzen Blick darauf werfen, was Hibernate mit der Annotation @Entity bietet .

Während der Erfüllung des JPA-Vertrags fügt @ org.hibernate.annotations.Entity zusätzliche Metadaten hinzu, die über die JPA-Spezifikation hinausgehen. Auf diese Weise können Sie die Persistenz von Entitäten optimieren. Schauen wir uns zum Beispiel einige von Hibernate angebotene Anmerkungen an, die die Funktionalität von @Entity erweitern :

  1. @Table - Ermöglicht die Angabe des Namens der für die Entität erstellten Tabelle
  2. @BatchSize - Gibt die Stapelgröße beim Abrufen von Berechtigungen aus der Tabelle an

Beachten Sie auch einige der zusätzlichen Funktionen, die in der JPA nicht angegeben sind und die sich in größeren Anwendungen als nützlich erweisen können:

  1. Anpassbare CRUD-Anweisungen mit den Annotationen @SQLInsert, @SQLUpate und @SQLDelete
  2. Unterstützung für das weiche Löschen
  3. Unveränderliche Entitäten mit der Annotation @Immutable

Um einen tieferen Einblick in die Persistenz im Ruhezustand und in Java zu erhalten, besuchen Sie unsere Tutorialserie zur Persistenz im Frühjahr.

6. EclipseLink

EclipseLink wurde von der Eclipse Foundation erstellt und bietet eine Open-Source-JPA-Implementierung . Darüber hinaus unterstützt EclipseLink eine Reihe anderer Persistenzstandards, z. B. Java Architecture for XML Binding (JAXB) .

Einfach ausgedrückt, anstatt ein Objekt in einer Datenbankzeile zu speichern, ordnet JAXB es einer XML-Darstellung zu.

Als nächstes sehen wir beim Vergleich derselben Annotation-Implementierung von @Entity , dass EclipseLink wieder verschiedene Erweiterungen bietet. Während es, wie bereits erwähnt, keine Annotation für @ BatchSize gibt , bietet EclipseLink andere Optionen, die Hibernate nicht bietet.

Zum Beispiel:

  1. @ReadOnly - Gibt an, dass die zu persistierende Entität schreibgeschützt ist
  2. @ Struct - Definiert die Klasse, die einem Datenbanktyp 'struct' zugeordnet werden soll

Um mehr über das Angebot von EclipseLink zu erfahren, lesen Sie unseren Leitfaden zu EclipseLink mit Spring.

7. Fazit

In diesem Artikel haben wir uns die Java Persistence API (JPA) angesehen.

Schließlich haben wir untersucht, wie es sich von Hibernate und EclipseLink unterscheidet.