web-dev-qa-db-fra.com

Quelle est la différence entre les interfaces CrudRepository et JpaRepository dans Spring Data JPA?

Quelle est la différence entre les interfaces CrudRepository et JpaRepository dans Spring Data JPA?

Quand je vois les exemples sur le web, je les vois là utilisés de manière interchangeable. Quelle est la différence entre eux? Pourquoi voudriez-vous utiliser l'un sur l'autre?

541
kseeker

JpaRepository s'étend PagingAndSortingRepository qui s'étend à son tour CrudRepository .

Leurs fonctions principales sont:

  • CrudRepository fournit principalement des fonctions CRUD.
  • PagingAndSortingRepository fournit des méthodes pour effectuer la pagination et le tri des enregistrements.
  • JpaRepository fournit certaines méthodes liées à JPA, telles que le vidage du contexte de persistance et la suppression d'enregistrements dans un lot.

En raison de l'héritage mentionné ci-dessus, JpaRepository aura toutes les fonctions de CrudRepository et PagingAndSortingRepository. Ainsi, si vous n'avez pas besoin que le référentiel ait les fonctions fournies par JpaRepository et PagingAndSortingRepository, utilisez CrudRepository.

762
Ken Chan

La réponse de Ken est fondamentalement juste, mais j'aimerais revenir sur le "pourquoi voudriez-vous utiliser l'un plutôt que l'autre?" une partie de votre question.

Les bases

L’interface de base que vous choisissez pour votre référentiel a deux objectifs principaux. Tout d'abord, vous permettez à l'infrastructure du référentiel Spring Data de trouver votre interface et de déclencher la création du proxy afin d'injecter des instances de l'interface dans les clients. Le second objectif est d’intégrer autant de fonctionnalités que nécessaire dans l’interface sans avoir à déclarer de méthodes supplémentaires.

Les interfaces communes

La bibliothèque principale de Spring Data est livrée avec deux interfaces de base qui exposent un ensemble dédié de fonctionnalités:

  • CrudRepository - Méthodes CRUD
  • PagingAndSortingRepository - méthodes de pagination et de tri (étend CrudRepository)

Interfaces spécifiques au magasin

Les modules de magasin individuels (par exemple, pour JPA ou MongoDB) présentent des extensions spécifiques à un magasin de ces interfaces de base pour permettre l’accès à des fonctionnalités spécifiques à un magasin, telles que le vidage ou la mise en lot dédiée, qui prennent en compte certaines spécificités de magasin. Un exemple pour ceci est deleteInBatch(…) sur JpaRepository qui est différent de delete(…) car il utilise une requête pour supprimer les entités données, ce qui est plus performant, mais a pour effet secondaire de ne pas déclencher le JPA. - cascades définies (comme le spécifie le définit).

Nous recommandons généralement de ne pas utiliser ces interfaces de base car elles exposent la technologie de persistance sous-jacente aux clients et resserrent ainsi le couplage entre eux et le référentiel. De plus, vous vous écartez un peu de la définition originale d'un référentiel qui est fondamentalement "une collection d'entités". Donc, si vous le pouvez, restez avec PagingAndSortingRepository.

Interfaces de base de référentiel personnalisé

L’inconvénient de dépendre directement de l’une des interfaces de base fournies est double. Les deux peuvent être considérés comme théoriques, mais je pense qu’il est important de savoir:

  1. Selon l'interface de référentiel Spring Data, votre interface de référentiel est couplée à la bibliothèque. Je ne pense pas que ce soit un problème en particulier, car vous utiliserez probablement des abstractions. comme Page ou Pageable dans votre code de toute façon. Les données de printemps ne sont pas différentes des autres bibliothèques générales telles que commons-lang ou Guava. Tant que cela procure un avantage raisonnable, tout va bien.
  2. En étendant par exemple CrudRepository, vous exposez un ensemble complet de méthodes de persistance à la fois. Cela convient probablement aussi dans la plupart des cas, mais vous risquez parfois de rencontrer des situations où vous souhaiteriez gagner davantage. contrôle minutieux sur les méthodes exposées, par exemple créer une ReadOnlyRepository qui n'inclut pas les méthodes save(…) et delete(…) de CrudRepository.

La solution à ces deux inconvénients est de créer votre propre interface de référentiel de base ou même un ensemble d’entre elles. Dans de nombreuses applications, j'ai vu quelque chose comme ceci:

interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { }

interface ReadOnlyRepository<T> extends Repository<T, Long> {

  // Al Finder methods go here
}

La première interface de référentiel est une interface de base à usage général qui ne corrige que le point 1 mais lie également le type d'ID à Long pour des raisons de cohérence. La seconde interface a généralement toutes les méthodes find…(…) copiées à partir de CrudRepository et PagingAndSortingRepository mais n'expose pas les méthodes de manipulation. En savoir plus sur cette approche dans le documentation de référence .

Résumé - tl; dr

L'abstraction de référentiel vous permet de choisir le référentiel de base totalement dirigé par vos besoins architecturaux et fonctionnels. Utilisez celles fournies prêtes à l'emploi si elles vous conviennent, construisez vos propres interfaces de base de référentiel si nécessaire. Éloignez-vous des interfaces de référentiel spécifiques au magasin, sauf si cela est inévitable.

352
Oliver Drotbohm

enter image description here

Résumé:

  • PagingAndSortingRepository étend CrudRepository

  • JpaRepository étend PagingAndSortingRepository

L’interface CrudRepository fournit des méthodes pour les opérations CRUD. Elle vous permet donc de créer, lire, mettre à jour et supprimer des enregistrements sans avoir à définir vos propres méthodes.

Le PagingAndSortingRepository fournit des méthodes supplémentaires pour extraire des entités à l'aide de la pagination et du tri.

Enfin, le JpaRepository ajoute des fonctionnalités supplémentaires propres à JPA.

59

J'apprends Spring Data JPA. Cela pourrait vous aider: enter image description here

3
Feng Zhang