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 commencerons par explorer ce qu'est JPA, comment il est utilisé et les concepts de base qui le sous- tendent.

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

2. Mappage objet-relationnel

Avant de plonger dans JPA, il est important de comprendre le concept de mappage objet-relationnel - également connu sous le nom d'ORM.

Le mappage objet-relationnel est simplement le processus de persistance d'un objet Java directement dans une table de base de données . Habituellement, le nom de l'objet persistant devient le nom de la table et chaque champ de cet objet devient une colonne. Une fois la table configurée, chaque ligne correspond à un enregistrement dans l'application.

3. Une introduction à JPA

L'API Java Persistence, 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 les objets de l'application qui doivent être persistants et comment ils doivent les conserver.

Il est important de noter ici que JPA n'est qu'une spécification et qu'il a besoin d'une implémentation pour fonctionner - mais plus à ce sujet plus tard.

Maintenant, discutons de certains des concepts JPA de base qu'une implémentation doit couvrir.

3.1. Entité

La classe javax.persistence.Entity définit les objets qui doivent être conservés dans la base de données . Pour chaque entité persistante, JPA crée une nouvelle table 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.

Jetons un coup d'œil à un exemple rapide d'une 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 d'implémentation.

3.2. Persistance du champ

Un autre concept central de JPA est la persistance des champs . Lorsqu'un objet en Java est défini comme une entité, tous les champs qu'il contient sont automatiquement conservés sous forme de colonnes différentes dans la table d'entités.

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

3.3. Des relations

Ensuite, JPA spécifie comment nous devons gérer les relations entre les différentes tables de base de données au sein de notre application. Comme nous l'avons vu, JPA gère cela avec des annotations. Nous devons garder à l'esprit quatre annotations de relation:

  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 classe SteeringWheel décrit une relation un à un avec notre classe Car de plus tôt.

3.4. Gestionnaire d'entités

Enfin, la classe javax.persistence.EntityManager spécifie les opérations vers et depuis la base de données. La EntityManager contient commune Create, Read, Update et opérations de suppression (CRUD) qui persistaient à la base de données.

4. Implémentations JPA

Avec la spécification JPA définissant comment et ce que nous devons persister, nous devons maintenant choisir un fournisseur d'implémentation pour fournir le code nécessaire . Sans un tel fournisseur, nous aurions besoin d'implémenter toutes les classes pertinentes pour se conformer à JPA, et c'est beaucoup de travail!

Il existe de nombreux fournisseurs parmi lesquels choisir, chacun affichant ses propres avantages et inconvénients. Lors de la prise de décision à utiliser, nous devons tenir compte de quelques-uns des points suivants :

  1. Maturité du projet - depuis combien de temps le fournisseur existe -t-il et dans quelle mesure est-il bien documenté?
  2. Sous-projets - le fournisseur a-t-il des sous-projets utiles pour notre nouvelle application?
  3. Support communautaire - y a-t-il quelqu'un pour nous aider lorsque nous nous retrouvons avec un bug critique ?
  4. Analyse comparative - quelle est la performance de la mise en œuvre?

Bien que nous n'allons 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. Hibernation

À la base, Hibernate est un outil de mappage objet-relationnel qui fournit une implémentation de JPA . Hibernate est l'une des implémentations JPA les plus matures du marché , avec une énorme communauté soutenant le projet.

Il implémente tout le javax.persistenceles classes que nous avons examinées plus tôt dans l'article et fournissent des fonctionnalités au-delà de JPA - outils, validation et recherche Hibernate. Bien que ces API spécifiques à Hibernate puissent être utiles, elles ne sont pas nécessaires dans les applications qui ne nécessitent que 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 ajoute des métadonnées supplémentaires qui vont au-delà de la spécification JPA. Cela permet d'affiner la persistance des entités. Par exemple, regardons quelques annotations proposées par Hibernate qui étendent les fonctionnalités de @Entity :

  1. @Table - nous permet de spécifier le nom de la table créée pour l'entité
  2. @BatchSize - spécifie la taille du lot lors de la récupération des droits de la table

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

  1. Personnalisable déclarations CRUD avec le @SQLInsert, @SQLUpate et @SQLDelete annotations
  2. Prise en charge de la suppression logicielle
  3. Entités immuables avec l' annotation @Immutable

Pour une plongée plus approfondie dans Hibernate et la persistance Java, consultez notre série de didacticiels de persistance Spring.

6. EclipseLink

EclipseLink, construit par la Fondation Eclipse, fournit une implémentation JPA open-source . De plus, EclipseLink prend en charge un certain nombre d'autres normes de persistance telles que Java Architecture for XML Binding (JAXB) .

En termes simples, plutôt que de conserver un objet sur une ligne de 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 à nouveau des extensions différentes. Bien qu'il n'y ait pas d'annotation pour @ BatchSize comme nous l'avons vu précédemment, EclipseLink offre d'autres options que Hibernate n'a pas.

Par exemple:

  1. @ReadOnly - spécifie que l'entité à persister est en lecture seule
  2. @ Struct - définit la classe à mapper sur un type de base de données 'struct'

Pour en savoir plus sur ce qu'EclipseLink a à offrir, consultez notre guide sur EclipseLink avec Spring.

7. Conclusion

Dans cet article, nous avons examiné l'API Java Persistence, ou JPA.

Enfin, nous avons exploré en quoi il diffère d'Hibernate et d'EclipseLink.