Quelle est la différence entre JPA et Spring Data JPA?

144

Je suis un peu confus sur la différence entre Spring Data-JPA et JPA. Je sais à propos de JPA qu'il s'agit d'une spécification permettant de conserver les objets Java dans une base de données relationnelle utilisant la technologie ORM populaire.

En d'autres termes, JPA fournit des interfaces et d'autres technologies ORM, implémente ces interfaces connues sous le nom de fournisseur JPA, par exemple Hibernate.

Maintenant, qu'est-ce que Spring Data JPA?

Spring Data JPA a-t-il ajouté des fonctionnalités supplémentaires (interfaces) par rapport à JPA et est-il toujours spécifié uniquement ou est-il également un fournisseur JPA?

J'ai vu Spring Data JPA travailler autour de référentiels (couche DAO: si je ne me trompe pas). Alors, je veux dire, en quoi est-ce différent d'utiliser 'Spring Data JPA + Hibernate' ou d'utiliser uniquement la direction 'Hibernate'?

DHRUV BANSAL
la source

Réponses:

126

J'ai vu Spring, JPA travaille autour de référentiels (couche DAO: si je ne me trompe pas). Donc je veux dire en quoi il est différent d'utiliser «Spring JPA + Hibernate» ou d'utiliser uniquement «Hibernate» directement?

Comme vous l'avez dit, JPA est une spécification tandis qu'Hibernate est une implémentation particulière de cette spécification (ces implémentations sont généralement appelées fournisseurs ). En utilisant Hibernate, vous vous associez à ce fournisseur limitant votre liberté de basculer vers une autre option si nécessaire (par exemple, vous souhaitez utiliser EclipseLink ou ObjectDB à la place car Hibernate a un bogue qui arrête votre processus de développement).

Citant Printemps des données JPA de » documentation:

La mise en œuvre d'une couche d'accès aux données d'une application a été lourde pendant un certain temps. Il a fallu écrire trop de code standard. Les classes de domaine étaient anémiques et n'ont pas été conçues d'une manière réelle orientée objet ou axée sur le domaine.

L'utilisation de ces deux technologies facilite beaucoup la vie des développeurs en ce qui concerne la persistance du modèle de domaine riche. Néanmoins, la quantité de code standard pour implémenter les référentiels, en particulier, est encore assez élevée. Ainsi, l'objectif de l'abstraction de référentiel de Spring Data est de réduire considérablement l'effort d'implémentation des couches d'accès aux données pour divers magasins de persistance.

Pour résumer, il s'ajoute à JPA en ajoutant une autre couche d'abstraction, une sorte de définition d'une conception standard pour prendre en charge la couche de persistance dans un contexte Spring. Ces interfaces définies (connues de Spring) fournissent les services que le framework gère à l'aide de JPA pour servir les résultats. Vous définissez un référentiel de manière à ce que Spring puisse analyser le projet et le trouver:

<repositories base-package="com.acme.repositories" />

Ainsi, vous permettant de l'utiliser dans le cadre d'un conteneur ou en dehors de celui-ci.

Maintenant, quel est exactement Spring, JPA. Spring, JPA a-t-il ajouté des fonctionnalités supplémentaires (interfaces) sur JPA et est-il toujours spécifié uniquement ou est-il également un fournisseur JPA?

Spring Data JPA fournit une définition pour implémenter des référentiels pris en charge sous le capot en référençant la spécification JPA, à l'aide du fournisseur que vous définissez.

Fritz
la source
1
Puis-je appeler Repository une collection d'entités gérées par Spring? Je ne sais pas pourquoi mais la prise en charge de Spring JPA à l'aide de référentiels semble très similaire à EntityManager d'EJB - est-ce la bonne idée ou sont-ils complètement différents dans leur objectif? Merci d'avance. Mustafa.
Mustafa
1
@Mustafa La plupart des solutions ont des bases communes. Bien que l'objectif soit le même, l'implémentation est différente en raison des interfaces impliquées.
Fritz
35

L'API Java Persistence, parfois appelée JPA, est un framework Java gérant les données relationnelles dans les applications utilisant la plateforme Java, Standard Edition (JavaSE) et Java Platform, Enterprise Edition (JavaEE).

La persistance dans ce contexte couvre trois domaines:

  • L'API elle-même, définie dans le javax.persistencepackage.

  • Le langage de requête de persistance Java (JPQL).

  • Métadonnées objet-relationnelles.

    entrez la description de l'image ici

Spring Data JPA fait partie du projet cadre Spring Data qui facilite la mise en œuvre de référentiels basés sur JPA.

Fonctionnalités:

  • Support sophistiqué pour créer des référentiels basés sur Spring et JPA
  • Prise en charge des prédicats QueryDSL et donc des requêtes JPA de type sécurisé
  • Audit transparent de la classe de domaine
  • Prise en charge de la pagination, exécution dynamique des requêtes, possibilité d'intégrer un code d'accès aux données personnalisé
  • Validation des @Queryrequêtes annotées au moment du bootstrap
  • Prise en charge du mappage d'entités basé sur XML
  • Configuration du référentiel basée sur JavaConfig en introduisant @EnableJpaRepositories

    entrez la description de l'image ici
Shreyos Adikari
la source
3

JPA

JPA est une spécification qui standardise la façon dont les objets Java sont mappés à un système de base de données relationnelle. Être juste une spécification, JPA se compose d'un ensemble d'interfaces, comme EntityManagerFactory, EntityManageret les annotations qui vous aident à mapper un objet entité Java à une table de base de données.

Il existe plusieurs fournisseurs JPA, comme HIbernate, EclipseLink ou Open JPA, que vous pouvez utiliser.

Spring Data JPA

Spring Data JPA est une abstraction d'accès aux données JPA. Tout comme JPA, Spring Data JPA ne peut pas fonctionner sans fournisseur JPA.

Spring Data JPA offre une solution au modèle DDDRepository ou au DAO (Data Acess Object) pattern. Il peut également générer des requêtes JPA en votre nom via des conventions de nom de méthode.

Spring Data JPA peut fonctionner avec Hibernate, Eclipse Link ou tout autre fournisseur JPA. Un avantage très intéressant de l'utilisation de Spring ou Java EE est que vous pouvez contrôler les limites de transaction de manière déclarative à l'aide de l' @Transactionalannotation .

Vlad Mihalcea
la source