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?
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?
Odpowiedzi:
JpaRepository
rozszerza się, PagingAndSortingRepository
co z kolei się wydłuża CrudRepository
.
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 funkcje CrudRepository
i PagingAndSortingRepository
. Jeśli więc nie potrzebujesz repozytorium, aby mieć funkcje zapewniane przez JpaRepository
i PagingAndSortingRepository
, użyj CrudRepository
.
Odpowiedź Kena jest w zasadzie słuszna, ale chciałbym rzucić okiem na „dlaczego chcesz używać jednego nad drugim?” część twojego pytania.
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.
Biblioteka podstawowa Spring Data zawiera dwa podstawowe interfejsy, które udostępniają dedykowany zestaw funkcji:
CrudRepository
- metody CRUDPagingAndSortingRepository
- metody paginacji i sortowania (rozszerza CrudRepository
)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(…)
na JpaRepository
który różni się od delete(…)
, 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ń zPagingAndSortingRepository
.
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ć taki ReadOnlyRepository
, który nie zawiera save(…)
i delete(…)
metod CrudRepository
.Rozwiązaniem obu tych wad jest stworzenie własnego interfejsu podstawowego repozytorium lub nawet ich zestawu. W wielu aplikacjach widziałem coś takiego:
interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { }
interface ReadOnlyRepository<T> extends Repository<T, Long> {
// Al finder methods go here
}
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 ma find…(…)
skopiowane wszystkie metody CrudRepository
i PagingAndSortingRepository
nie ujawnia metod manipulujących. Przeczytaj więcej na temat tego podejścia w dokumentacji referencyjnej .
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.
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.
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ą.