La réponse de Ken est en principe correcte, mais j'aimerais intervenir sur la partie "pourquoi vouloir utiliser l'un plutôt que l'autre" de votre question.
Principes de base
L'interface de base que vous choisissez pour votre référentiel a deux objectifs principaux. Premièrement, vous permettez à l'infrastructure du référentiel Spring Data de trouver votre interface et de déclencher la création d'un proxy afin que vous puissiez 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 des 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 de fonctionnalités dédiées :
-
CrudRepository
- Méthodes CRUD
-
PagingAndSortingRepository
- des méthodes de pagination et de tri (étendues CrudRepository
)
Interfaces spécifiques aux magasins
Les modules de stockage individuels (par exemple, pour JPA ou MongoDB) exposent des extensions spécifiques au stockage de ces interfaces de base afin de permettre l'accès à des fonctionnalités spécifiques au stockage, comme le flushing ou le batching dédié, qui prennent en compte certaines spécificités du stockage. Un exemple de ceci est deleteInBatch(…)
de JpaRepository
qui est différent de delete(…)
car elle 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 les cascades définies par JPA (comme la spécification le définit).
Nous recommandons généralement no d'utiliser ces interfaces de base car elles exposent la technologie de persistance sous-jacente aux clients et renforcent ainsi le couplage entre ces derniers et le référentiel. De plus, on s'éloigne un peu de la définition originale d'un référentiel qui est essentiellement "une collection d'entités". Donc, si vous le pouvez, restez avec PagingAndSortingRepository
.
Interfaces de base de référentiel personnalisées
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 d'en être conscient :
-
En fonction d'une interface de référentiel Spring Data, couplez votre interface de référentiel à la bibliothèque. Je ne pense pas que ce soit un problème particulier car vous utiliserez probablement des abstractions telles que
Page
o Pageable
dans votre code de toute façon. Spring Data n'est pas différent de toute autre bibliothèque à usage général comme commons-lang ou Guava. Tant qu'il fournit un avantage raisonnable, c'est parfait.
-
En étendant par exemple
CrudRepository
vous exposez un ensemble complet de méthodes de persistance en une seule fois. C'est probablement très bien dans la plupart des cas, mais vous pouvez rencontrer des situations où vous souhaitez obtenir un contrôle plus fin sur les méthodes exposées, par exemple pour créer un fichier ReadOnlyRepository
qui n'inclut pas le save(…)
y delete(…)
méthodes de CrudRepository
.
La solution à ces deux inconvénients consiste à créer votre propre interface de référentiel de base ou même un ensemble d'interfaces. Dans beaucoup d'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 dépôt est une interface de base générale qui ne corrige en fait que le point 1, mais qui lie également le type d'ID à être Long
par souci de cohérence. La deuxième interface a généralement toutes les find…(…)
méthodes copiées de CrudRepository
y PagingAndSortingRepository
mais n'expose pas les manipulateurs. Pour en savoir plus sur cette approche, consultez le documents de référence .
Résumé - tl;dr
L'abstraction du référentiel vous permet de choisir le référentiel de base en fonction de vos besoins architecturaux et fonctionnels. Utilisez ceux qui sont fournis dans la boîte s'ils conviennent, créez vos propres interfaces de base de référentiel si nécessaire. Restez à l'écart des interfaces de référentiel spécifiques au magasin, sauf si cela est inévitable.
1 votes
Lisez également la section de cet article Introduction aux référentiels de Spring Data