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?
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
.
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.
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.
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 CRUDPagingAndSortingRepository
- méthodes de pagination et de tri (étend CrudRepository
)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
.
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:
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.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 .
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.
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.