Einführung

In diesem Tutorial werden wir Hibernate und die Java Persistence API (JPA) besprechen – mit einem Schwerpunkt auf den Unterschieden zwischen ihnen.

Zunächst werden wir uns ansehen, was JPA ist, wie es verwendet wird und welche Konzepte dahinter stecken.

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

Objektrelationales Mapping

Bevor wir uns mit JPA beschäftigen, ist es wichtig, das Konzept des objektrelationalen Mappings – auch bekannt als ORM – zu verstehen.

Objektrelationales Mapping ist einfach der Prozess der Persistierung eines beliebigen Java-Objekts direkt in eine Datenbanktabelle. In der Regel wird der Name des Objekts, das persistiert wird, zum Namen der Tabelle, und jedes Feld innerhalb dieses Objekts wird zu einer Spalte. Wenn die Tabelle eingerichtet ist, entspricht jede Zeile einem Datensatz in der Anwendung.

Eine Einführung in JPA

Die Java Persistence API, oder JPA, ist eine Spezifikation, die die Verwaltung relationaler Daten in einer Java-Anwendung definiert. Die API bildet eine Reihe von Konzepten ab, die definieren, welche Objekte innerhalb der Anwendung persistiert werden sollen und wie sie persistiert werden sollen.

Es ist wichtig, an dieser Stelle anzumerken, dass JPA nur eine Spezifikation ist und dass es eine Implementierung benötigt, um zu funktionieren – aber dazu später mehr.

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

3.1. Entity

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

Außerdem sollten alle gewählten Entitäten einen Primärschlüssel definieren, der durch die @Id-Annotation gekennzeichnet ist. Zusammen mit der @GeneratedValue-Annotation definieren wir, dass der Primärschlüssel automatisch generiert werden soll, wenn der Datensatz in die Datenbank persistiert wird.

Werfen wir einen Blick auf ein kurzes Beispiel einer Entität, die von JPA beschrieben wird.

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

Erinnern Sie sich, dass dies derzeit keine Auswirkungen auf die Anwendung hat – JPA bietet keinen Implementierungscode.

3.2. Feldpersistenz

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

Wenn es ein Feld innerhalb eines persistierten Objekts gibt, das wir nicht in der Datenbank persistieren wollen, können wir das Feld mit der @Transient-Annotation als transient erklären.

3.3. Beziehungen

Als nächstes legt JPA fest, wie wir Beziehungen zwischen verschiedenen Datenbanktabellen innerhalb unserer Anwendung verwalten sollen. Wie wir gesehen haben, behandelt JPA dies mit Annotationen. Es gibt vier Beziehungsannotationen, die wir im Auge behalten müssen:

  1. @OneToOne
  2. @OneToMany
  3. @ManyToOne
  4. @ManyToMany

Schauen wir uns an, wie das funktioniert:

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

In unserem obigen Beispiel beschreibt die Klasse SteeringWheel eine Eins-zu-Eins-Beziehung mit unserer Klasse Car von vorhin.

3.4. Entity Manager

Schließlich spezifiziert die Klasse javax.persistence.EntityManager Operationen zur und von der Datenbank. Der EntityManager enthält allgemeine Create-, Read-, Update- und Delete-Operationen (CRUD), die in der Datenbank persistiert werden.

JPA-Implementierungen

Nachdem die JPA-Spezifikation definiert hat, wie und was persistiert werden soll, müssen wir nun einen Implementierungsanbieter auswählen, der den erforderlichen Code liefert. Ohne einen solchen Anbieter müssten wir alle relevanten Klassen implementieren, um mit JPA konform zu sein, und das ist eine Menge Arbeit!

Es gibt viele Anbieter, aus denen man wählen kann, wobei jeder seine eigenen Vor- und Nachteile aufweist. Bei der Entscheidung für einen Anbieter sollte man einige der folgenden Punkte berücksichtigen:

  1. Projektreife – wie lange gibt es den Anbieter schon, und wie gut ist er dokumentiert?
  2. Unterprojekte – verfügt der Anbieter über nützliche Unterprojekte für unsere neue Anwendung?
  3. Community-Support – gibt es jemanden, der uns hilft, wenn wir einen kritischen Fehler finden?
  4. Benchmarking – wie performant ist die Implementierung?

Wir werden zwar nicht näher auf das Benchmarking verschiedener JPA-Provider eingehen, aber der JPA Performance Benchmark (JPAB) bietet wertvolle Einblicke in diese Thematik.

Werfen wir nun einen kurzen Blick auf einige der wichtigsten JPA-Anbieter.

Hibernate

Im Kern ist Hibernate ein objekt-relationales Mapping-Tool, das eine Implementierung von JPA bietet. Hibernate ist eine der ausgereiftesten JPA-Implementierungen auf dem Markt und wird von einer großen Community unterstützt.

Es implementiert alle javax.persistence-Klassen, die wir weiter oben in diesem Artikel betrachtet haben, und bietet darüber hinaus Funktionen, die über JPA hinausgehen – Hibernate-Tools, Validierung und Suche. Obwohl diese Hibernate-spezifischen APIs nützlich sein können, werden sie in Anwendungen, die nur die JPA-Basisfunktionalität benötigen, nicht benötigt.

Werfen wir einen kurzen Blick darauf, was Hibernate mit der @Entity-Annotation bietet.

Während es den JPA-Vertrag erfüllt, fügt @org.hibernate.annotations.Entity zusätzliche Metadaten hinzu, die über die JPA-Spezifikation hinausgehen. Dies ermöglicht die Feinabstimmung der Persistenz von Entitäten. Sehen wir uns zum Beispiel einige von Hibernate angebotene Annotationen 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 Entitäten aus der Tabelle an

Es lohnt sich auch, auf einige der zusätzlichen Funktionen hinzuweisen, die in JPA nicht spezifiziert 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 Soft Deleting
  3. Immutable Entities mit der Annotation @Immutable

Für einen tieferen Einblick in Hibernate und Java-Persistenz – schauen Sie sich unsere Spring-Persistenz-Tutorial-Serie an.

EclipseLink

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

Einfach ausgedrückt: Statt ein Objekt in einer Datenbankzeile zu persistieren, bildet JAXB es auf eine XML-Darstellung ab.

Wenn wir dieselbe @Entity-Annotation-Implementierung vergleichen, sehen wir, dass EclipseLink wiederum andere Erweiterungen bietet. Während es keine Annotation für @BatchSize gibt, wie wir zuvor gesehen haben, bietet EclipseLink andere Optionen, die Hibernate nicht hat.

Zum Beispiel:

  1. @ReadOnly – legt fest, dass die zu persistierende Entität schreibgeschützt ist
  2. @Struct – definiert die Klasse, die auf einen Datenbank-’struct‘-Typ abgebildet werden soll

Um mehr darüber zu erfahren, was EclipseLink zu bieten hat, besuchen Sie unseren Leitfaden zu EclipseLink mit Spring.

Abschluss

In diesem Artikel haben wir uns mit der Java Persistence API, kurz JPA, beschäftigt.

Abschließend haben wir untersucht, wie sie sich von Hibernate und EclipseLink unterscheidet.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.