Jaka jest różnica między interfejsami CrudRepository i JpaRepository w JPA Spring Data?

Odpowiedzi:

954

JpaRepositoryrozszerza się, PagingAndSortingRepositoryco 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, JpaRepositorybędą miały wszystkie funkcje CrudRepositoryi PagingAndSortingRepository. Jeśli więc nie potrzebujesz repozytorium, aby mieć funkcje zapewniane przez JpaRepositoryi PagingAndSortingRepository, użyj CrudRepository.

Ken Chan
źródło
142
i zwraca List <> zamiast Iterable <> w findAll () :-)
Hinotori
396

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 CRUD
  • PagingAndSortingRepository- metody paginacji i sortowania (rozszerza CrudRepository)

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(…)na JpaRepositoryktó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 .

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:

  1. W zależności od interfejsu repozytorium Spring Data łączy on interfejs repozytorium z biblioteką. Nie sądzę, że jest to szczególny problem, ponieważ prawdopodobnie użyjesz abstrakcji takich jak PagelubPageable 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.
  2. Rozszerzając np. 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ć Longspójność. Drugi interfejs zwykle ma find…(…)skopiowane wszystkie metody CrudRepositoryi PagingAndSortingRepositorynie 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.

Oliver Drotbohm
źródło
84

wprowadź opis zdjęcia tutaj

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.

Joby Wilson Mathews
źródło
Co z rozszerzeniem repozytorium <>? Jakie będą mieć metody? Taki sam jak CrudRepository?
s-kaczmarek
15

Uczę się JPA Spring Data. Może ci to pomóc: wprowadź opis zdjęcia tutaj

Evan
źródło
3

Wszystkie odpowiedzi zawierają wystarczające szczegóły pytania. Pozwól mi jednak dodać coś więcej.

Dlaczego korzystamy z tych interfejsów:

  • Pozwalają Springowi znaleźć interfejsy repozytorium i utworzyć dla nich obiekty proxy.
  • Udostępnia metody umożliwiające wykonywanie niektórych typowych operacji (możesz również zdefiniować metodę niestandardową). Uwielbiam tę funkcję, ponieważ tworzenie metody (i definiowanie zapytania i przygotowanych instrukcji, a następnie wykonywanie zapytania za pomocą obiektu połączenia) w celu wykonania prostej operacji naprawdę jest do kitu!

Który interfejs działa:

  • CrudRepository : zapewnia funkcje CRUD
  • PagingAndSortingRepository : zapewnia metody podziału na strony i sortowania rekordów
  • JpaRepository : zapewnia metody związane z JPA, takie jak opróżnianie kontekstu trwałości i usuwanie rekordów we wsadzie

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ą.

Rahul Vala
źródło