Jaka jest różnica między interfejsami CrudRepository i JpaRepository w JPA Spring Data ?
Kiedy widzę przykłady w Internecie, widzę, że są tam używane zamiennie.
Jaka jest różnica między nimi?
Dlaczego miałbyś chcieć używać jednego nad drugim?
java
spring
jpa
spring-data
spring-data-jpa
kseeker
źródło
źródło
Odpowiedzi:
JpaRepository
rozszerza się,PagingAndSortingRepository
co z kolei się wydłużaCrudRepository
.Ich główne funkcje to:
CrudRepository
głównie zapewnia funkcje CRUD.PagingAndSortingRepository
zapewnia metody stronicowania i sortowania rekordów.JpaRepository
udostępnia niektóre metody związane z JPA, takie jak opróżnianie kontekstu trwałości i usuwanie rekordów we wsadzie.Z powodu dziedziczenia wspomnianego powyżej,
JpaRepository
będą miały wszystkie funkcjeCrudRepository
iPagingAndSortingRepository
. Jeśli więc nie potrzebujesz repozytorium, aby mieć funkcje zapewniane przezJpaRepository
iPagingAndSortingRepository
, użyjCrudRepository
.źródło
Odpowiedź Kena jest w zasadzie słuszna, ale chciałbym rzucić okiem na „dlaczego chcesz używać jednego nad drugim?” część twojego pytania.
Podstawy
Interfejs podstawowy wybrany dla repozytorium ma dwa główne cele. Po pierwsze, zezwalasz infrastrukturze repozytorium Spring Data na znalezienie twojego interfejsu i uruchomienie tworzenia proxy, aby wstrzyknąć wystąpienia interfejsu do klientów. Drugi cel polega na wprowadzeniu do interfejsu tyle funkcji, ile potrzeba, bez konieczności deklarowania dodatkowych metod.
Wspólne interfejsy
Biblioteka podstawowa Spring Data zawiera dwa podstawowe interfejsy, które udostępniają dedykowany zestaw funkcji:
CrudRepository
- metody CRUDPagingAndSortingRepository
- metody paginacji i sortowania (rozszerzaCrudRepository
)Interfejsy specyficzne dla sklepu
Poszczególne moduły sklepu (np. JPA lub MongoDB) udostępniają rozszerzenia tych interfejsów specyficzne dla sklepu, aby umożliwić dostęp do funkcji specyficznych dla sklepu, takich jak opróżnianie lub dedykowane grupowanie, które uwzględniają niektóre cechy sklepu. Przykładem na to jest
deleteInBatch(…)
naJpaRepository
który różni się oddelete(…)
, ponieważ wykorzystuje zapytanie do usuwania podane jednostki, która jest bardziej wydajnych lecz pochodzi z skutku ubocznego nie wyzwolenie kaskady JPA zdefiniowane (jak spec określa ją).Zasadniczo zalecamy, aby nie używać tych interfejsów bazowych, ponieważ ujawniają klientom podstawową technologię trwałości, a tym samym zacieśniają sprzężenie między nimi a repozytorium. Co więcej, odsuwasz się nieco od oryginalnej definicji repozytorium, które jest w zasadzie „zbiorem jednostek”. Więc jeśli możesz, zostań z
PagingAndSortingRepository
.Niestandardowe podstawowe interfejsy repozytorium
Minusem bezpośredniego uzależnienia od jednego z dostarczonych interfejsów bazowych jest dwukrotność. Oba mogą być uważane za teoretyczne, ale myślę, że należy pamiętać o:
Page
lubPageable
w kodzie. Spring Data nie różni się niczym od innych bibliotek ogólnego przeznaczenia, takich jak commons-lang czy Guava. Tak długo, jak zapewnia rozsądne korzyści, jest w porządku.CrudRepository
, Narazisz pełny zestaw metod trwałości naraz. Prawdopodobnie jest to również w porządku w większości przypadków, ale możesz natknąć się na sytuacje, w których chciałbyś uzyskać bardziej szczegółową kontrolę nad metodami, na przykład, aby stworzyć takiReadOnlyRepository
, który nie zawierasave(…)
idelete(…)
metodCrudRepository
.Rozwiązaniem obu tych wad jest stworzenie własnego interfejsu podstawowego repozytorium lub nawet ich zestawu. W wielu aplikacjach widziałem coś takiego:
Pierwszy interfejs repozytorium jest jakimś podstawowym interfejsem ogólnego przeznaczenia, który w rzeczywistości naprawia tylko punkt 1, ale także wiąże typ identyfikatora, aby zapewnić
Long
spójność. Drugi interfejs zwykle mafind…(…)
skopiowane wszystkie metodyCrudRepository
iPagingAndSortingRepository
nie ujawnia metod manipulujących. Przeczytaj więcej na temat tego podejścia w dokumentacji referencyjnej .Podsumowanie - tl; dr
Abstrakcja repozytorium pozwala wybrać repozytorium bazowe całkowicie zależne od twoich potrzeb architektonicznych i funkcjonalnych. Jeśli są odpowiednie, użyj dostarczonych z pudełka, w razie potrzeby stwórz własne bazowe interfejsy repozytorium. Unikaj specyficznych dla sklepu interfejsów repozytorium, chyba że jest to nieuniknione.
źródło
Podsumowanie:
PagingAndSortingRepository rozszerza CrudRepository
JpaRepository rozszerza PagingAndSortingRepository
CrudRepository interfejs zapewnia metody operacji CRUD, więc pozwala na Crud rekordy bez konieczności definiowania własnych metod.
PagingAndSortingRepository zapewnia dodatkowe metody pobierania podmioty pomocą paginacji i sortowania.
Wreszcie JpaRepository dodaje jeszcze więcej funkcji specyficznych dla JPA.
źródło
Uczę się JPA Spring Data. Może ci to pomóc:
źródło
Wszystkie odpowiedzi zawierają wystarczające szczegóły pytania. Pozwól mi jednak dodać coś więcej.
Dlaczego korzystamy z tych interfejsów:
Który interfejs działa:
Kiedy używać którego interfejsu:
Według http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/
Ogólnie najlepszym pomysłem jest użycie CrudRepository lub PagingAndSortingRepository w zależności od tego, czy potrzebujesz sortowania i stronicowania, czy nie.
JpaRepository należy unikać, jeśli to możliwe, ponieważ wiąże ty repozytoriów do technologii utrwalania JPA, aw większości przypadków prawdopodobnie nie będzie nawet użyć dodatkowych metod przewidzianych przez nią.
źródło