La différence entre JPA, Hibernate et EclipseLink

1. introduction

Dans ce didacticiel, nous aborderons Hibernate et l'API Java Persistence (JPA), en mettant l'accent sur les différences entre eux.

Nous seronsstart by exploring what JPA is, how it’s used, and the core conceptsderrière.

Ensuite, nous examinerons comment Hibernate et EclipseLink s'intègrent dans l'image.

2. Cartographie relationnelle d'objet

Avant de plonger dans JPA, il est important de comprendre le concept de mappage objet-relationnel, également appelé ORM.

Le mappage objet-relationnel est simplementthe process of persisting any Java object directly to a database table. Généralement, le nom de l'objet persistant devient le nom de la table et chaque champ de cet objet devient une colonne. Avec la table configurée, chaque ligne correspond à un enregistrement dans l'application.

3. Une introduction à l'APP

L'API de persistance Java, ou JPA, est une spécification qui définit la gestion des données relationnelles dans une application Java. L'API mappe un ensemble de concepts qui définit quels objets de l'application doivent être conservés et comment ils doivent être conservés.

Il est important de noter ici queJPA is only a specification and that it needs an implementation to work - mais plus deon that later.

Voyons maintenant quelques-uns des concepts JPA de base qu'une implémentation doit couvrir.

3.1. Entité

Lesjavax.persistence.Entity class defines which objects should be persisted to the database. JPA crée une nouvelle table pour chaque entité persistante dans la base de données choisie.

De plus, toutes les entités choisies doivent définir une clé primaire désignée par l'annotation@Id . Avec l'annotation@GeneratedValue , nous définissons que la clé primaire doit être générée automatiquement lorsque l'enregistrement est conservé dans la base de données.

Prenons un rapide exemple d’entité décrite par JPA.

@Entity
public class Car {

    @GeneratedValue
    @Id
    public long id;

    // getters and setters

}

N'oubliez pas que cela n'aura actuellement aucun effet sur l'application - JPA ne fournit aucun code de mise en œuvre.

3.2. Persistance sur le terrain

Another core concept of JPA is field persistence. Lorsqu'un objet en Java est défini en tant qu'entité, tous les champs qu'il contient sont automatiquement conservés en tant que colonnes différentes dans la table d'entités.

S'il y a un champ dans un objet persistant que nousdon’t tentons de conserver dans la base de données, nous pouvons déclarer le champ transitoire avec l'annotation@Transient .

3.3. Des relations

Ensuite,JPA specifies how we should manage relationships between different database tables dans notre application. Comme nous l'avons vu, JPA gère cela avec des annotations. Il y a quatre annotations de relation que nous devons garder à l'esprit:

  1. @Un par un

  2. @OneToMany

  3. @ManyToOne

  4. @Plusieurs à plusieurs

Voyons comment cela fonctionne:

@Entity
public class SteeringWheel {

    @OneToOne
    private Car car

    // getters and setters
}

Dans notre exemple ci-dessus, la classeSteeringWheel décrit une relation un à un avec notre classeCar antérieure.

3.4. Gestionnaire d'entité

Enfin,javax.persistence.EntityManager class pécifie les opérations vers et depuis la base de données. LesEntityManager contains common Create, Read, Update and Delete (CRUD) operations qui sontpersisted dans la base de données.

4. Implémentations JPA

Avec la spécification JPA définissant comment et ce que nous devons persister, nousneed to choose an implementation provider to supply the necessary code. Sans un tel fournisseur, nous aurions besoin d'implémenter toutes les classes pertinentes pour se conformer à JPA, et c'est unlotde travail!

Il existe de nombreux fournisseurs parmi lesquels choisir, chacun affichant ses propres avantages et inconvénients. When making a decision sur lequel utiliser, nous devrionsconsider a few of the following points:

  1. Maturité du projet -*how long has the provider been around*, and how well documented is it?

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

  3. Soutien communautaire -is there anyone to help us out when we end up with a critical bug?

  4. Analyse comparative -*how performant* is the implementation?

Bien que nous n'allions pas approfondir l'analyse comparative des différents fournisseurs JPA,JPA Performance Benchmark (JPAB) contient des informations précieuses à ce sujet.

Avec cela à l'écart, jetons un bref coup d'œil à certains des principaux fournisseurs de JPA.

5. Hiberner

À la base,Hibernate is an object-relational mapping tool that provides an implementation of JPA. Hibernate is one of the most mature JPA implementations autour, avec une énorme communauté soutenant le projet.

Il implémente toutes les classesjavax.persistence que nous avons examinées plus tôt dans l'article et fournit des fonctionnalités au-delà de JPA -Hibernate tools,validation etsearch. Bien que ces API spécifiques à Hibernate puissent être utiles, elles ne sont pas nécessaires dans les applications nécessitant uniquement la fonctionnalité JPA de base.

Jetons un coup d'œil à ce qu'offre Hibernate avec l'annotation@Entity.

Tout en remplissant le contrat JPA,@org.hibernate.annotations.Entity adds additional metadata that goes beyond JPA specification. Cela permet d'affiner la persistance de l'entité. Par exemple, examinons quelques annotations proposées parHibernate that extends the functionality of @Entity:

  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

Il convient également de noter quelques-unes des fonctionnalités supplémentaires que le JPA ne spécifie pas et qui peuvent s'avérer utiles dans les applications plus volumineuses:

  1. Instructions CRUD personnalisables avec les annotations@SQLInsert, @SQLUpate and @SQLDelete 

  2. Prise en charge de la suppression progressive

  3. Entités immuables avec l'annotation@Immutable 

Pour une plongée plus approfondie dans Hibernate et la persistance Java, rendez-vous sur nosSpring persistence tutorial series.

EclipseLink, construit par la Fondation Eclipse,provides an open-sourced JPA implementation. De plus, EclipseLinksupports a number of other persistence standards such as Java Architecture for XML Binding (JAXB).

En bref, plutôt que de conserver un objet sur une ligne de la base de données, JAXB le mappe à une représentation XML.

Ensuite, en comparant la même implémentation d'annotation@Entity, nous voyons qu'EclipseLink propose à nouveaudifferent extensions. Bien qu'il n'y ait pas d'annotation pour @BatchSize  comme nous l'avons vu plus tôt,EclipseLink offers other options that Hibernate doesn’t.

Par exemple:

  1. @ReadOnly - spécifie que l'entité à persister est en lecture seule

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

Pour en savoir plus sur ce qu'EclipseLink a à offrir, rendez-vous sur nosguide on EclipseLink with Spring.

7. Conclusion

Dans cet article, nous avonslooked at the Java Persistence API, or JPA.

Enfin, nous avons exploréhow it differs from Hibernate and EclipseLink.