Der Unterschied zwischen JPA, Hibernate und EclipseLink

1. Einführung

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

Wir werdenstart by exploring what JPA is, how it’s used, and the core conceptsdahinter stecken.

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.

Die objektrelationale Zuordnung beträgt einfachthe process of persisting any Java object directly to a database table. 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 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 in der Anwendung beibehalten werden sollen und wie sie beibehalten werden sollen.

Hierbei ist zu beachten, dassJPA is only a specification and that it needs an implementation to work - aber mehron that later.

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

3.1. Entität

Diejavax.persistence.Entity class defines which objects should be persisted to the database. Für jede persistente 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@Id -Sannotation gekennzeichnet ist. Zusammen mit der@GeneratedValue -Sannotation 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

Another core concept of JPA is field persistence. Wenn ein Objekt in Java als Entität definiert ist, werden alle Felder in Java automatisch als unterschiedliche Spalten in der Entitätstabelle beibehalten.

Wenn sich in einem persistierten Objekt ein Feld befindet, dasdon’t in der Datenbank beibehalten soll, können wir das Feld mit der Sannotation@Transient als transient deklarieren.

3.3. Beziehungen

Als nächstesJPA specifies how we should manage relationships between different database tables in unserer Anwendung. Wie wir gesehen haben, behandelt JPA dies mit Anmerkungen. Es gibt vier Beziehungskommentare, 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 dieSteeringWheel -Klasse eine Eins-zu-Eins-Beziehung zu unsererCar -Skala von früher.

3.4. Entity Manager

Schließlich spezifiziertjavax.persistence.EntityManager class Operationen zur und von der Datenbank. DieEntityManager contains common Create, Read, Update and Delete (CRUD) operations, diepersisted in der Datenbank sind.

4. JPA-Implementierungen

Mit der JPA-Spezifikation, die definiert, wie und was wir beibehalten sollen, haben wir jetztneed to choose an implementation provider to supply the necessary code. Ohne einen solchen Anbieter müssten wir alle relevanten Klassen implementieren, um mit JPA übereinzustimmen, und das ist ein Prozentsatz (t1) der Arbeit!

Es stehen zahlreiche Anbieter zur Auswahl, von denen jeder seine eigenen Vor- und Nachteile aufweist. When making a decision, für die verwendet werden soll, sollten wirconsider a few of the following points:

  1. Projektlaufzeit -*how long has the provider been around*, and how well documented is it?

  2. Teilprojekte -*does the provider have any useful subprojects* for our new application?

  3. Gemeinschaftsunterstützung -is there anyone to help us out when we end up with a critical bug?

  4. Benchmarking -*how performant* is the implementation?

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

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

5. Überwintern

Im KernHibernate is an object-relational mapping tool that provides an implementation of JPA. Hibernate is one of the most mature JPA implementationsist da, und eine riesige Community unterstützt das Projekt.

Es implementiert allejavax.persistence -Skalen, die wir weiter oben in diesem Artikel betrachtet haben, und bietet Funktionen, die über JPA hinausgehen -Hibernate tools,validation undsearch. Obwohl diese Ruhezustands-spezifischen APIs nützlich sein können, werden sie in Anwendungen, die nur die JPA-Basisfunktionalität benötigen, nicht benötigt.

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

Während der Erfüllung des JPA-Vertrags ermöglicht@org.hibernate.annotations.Entity adds additional metadata that goes beyond JPA specification. die Feinabstimmung der Persistenz von Entitäten. Schauen wir uns zum Beispiel einige Anmerkungen an, die vonHibernate that extends the functionality of @Entity: angeboten werden

  1. @Table allows us to specify the name of the table created for the entity

  2. @BatchSize -specifies the batch size when retrieving entities from the table

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@SQLInsert, @SQLUpate and @SQLDelete -Sannotationen

  2. Unterstützung für weiches Löschen

  3. Unveränderliche Einheiten mit der Sannotation@Immutable 

Um einen tieferen Einblick in die Persistenz von Hibernate und Java zu erhalten, besuchen Sie unsereSpring persistence tutorial series.

EclipseLink, erstellt von der Eclipse Foundation,provides an open-sourced JPA implementation. Zusätzlich EclipseLinksupports a number of other persistence standards such as Java Architecture for XML Binding (JAXB).

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

Als nächstes sehen wir beim Vergleich derselben Annotationsimplementierung von@Entity, dass EclipseLink wiederdifferent extensions bietet. Während es keine Anmerkung für @BatchSize as gibt, wie wir zuvor gesehen haben,EclipseLink offers other options that Hibernate doesn’t.

Zum Beispiel:

  1. @ReadOnly - Gibt an, dass die zu persistierende Entität schreibgeschützt ist

  2. @Struct – defines the class to map to a database ‘struct' type

Um mehr über das Angebot von EclipseLink zu erfahren, besuchen Sie unsereguide on EclipseLink with Spring.

7. Fazit

In diesem Artikel haben wirlooked at the Java Persistence API, or JPA.

Schließlich untersuchten wirhow it differs from Hibernate and EclipseLink.