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

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

Kiedy widzę przykłady w sieci, widzę je tam używane zamiennie. Jaka jest między nimi różnica? Dlaczego chcesz użyć jednego nad drugim?

Author: Peter Mortensen, 2012-12-23

3 answers

Jparepository rozszerza PagingAndSortingRepository , które z kolei rozszerza CrudRepository .

Ich główne funkcje to:

Ze względu na dziedziczenie wymienione powyżej, JpaRepository będzie miał wszystkie funkcje CrudRepository i PagingAndSortingRepository. Jeśli więc nie potrzebujesz, aby repozytorium miało funkcje dostarczane przez JpaRepository i PagingAndSortingRepository, Użyj CrudRepository.

 540
Author: Ken Chan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-23 11:45:33

Odpowiedź Kena jest w zasadzie słuszna, ale chciałbym zapytać: "dlaczego chcesz używać jednego nad drugim?"część twojego pytania.

Podstawy

Podstawowy interfejs, który wybierzesz dla swojego repozytorium, ma dwa główne cele. Po pierwsze, zezwalasz infrastrukturze repozytorium danych Spring na znalezienie twojego interfejsu i uruchamiasz tworzenie proxy, aby wstrzykiwać instancje interfejsu do klientów. Drugim celem jest wciągnięcie jak największej funkcjonalności w interfejs bez konieczności deklarowania dodatkowych metod.

Wspólne interfejsy

Biblioteka Spring Data core jest wyposażona w dwa interfejsy bazowe, które udostępniają dedykowany zestaw funkcji:]}
  • CrudRepository - Metody CRUD
  • PagingAndSortingRepository - metody paginacji i sortowania (extends CrudRepository)

Interfejsy specyficzne dla sklepu

Poszczególne moduły sklepu (np. dla JPA lub MongoDB) wystawiają specyficzne dla sklepu rozszerzenia tych interfejsów bazowych na Zezwalaj na dostęp do funkcji specyficznych dla sklepu, takich jak płukanie lub dedykowane dozowanie, które uwzględniają niektóre szczegóły sklepu. Przykładem tego jest deleteInBatch(…) z JpaRepository, który różni się od delete(…), ponieważ używa zapytania do usuwania podanych jednostek, które jest bardziej wydajne, ale pochodzi z efektem ubocznym nie wyzwalania kaskad zdefiniowanych przez JPA (jak definiuje to spec).

Ogólnie zalecamy nie aby używać tych interfejsów bazowych, ponieważ ujawniają one trwałość technologii do klientów, a tym samym dokręcić połączenie między nimi a repozytorium. Co więcej, trochę oddalasz się od oryginalnej definicji repozytorium, które jest w zasadzie "zbiorem podmiotów". Więc jeśli możesz, zostań z PagingAndSortingRepository.

Własne interfejsy bazy repozytoriów

Minusem bezpośrednio zależnego od jednego z dostarczonych interfejsów bazowych jest dwukrotność. Oba mogą być uznane za teoretyczne, ale myślę, że są ważne, aby być świadomym of:

  1. W zależności od interfejsu repozytorium danych a Spring łączy interfejs repozytorium z biblioteką. nie sądzę, że jest to szczególny problem, ponieważ prawdopodobnie będziesz używał abstrakcji takich jak Page lub Pageable w swoim kodzie. Dane źródłowe 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, ujawniasz kompletny zestaw trwałości metoda na raz. jest to prawdopodobnie w porządku również w większości sytuacji, ale możesz napotkać sytuacje, w których chciałbyś uzyskać bardziej drobnoziarnistą kontrolę nad metodami expose, np. stworzyć ReadOnlyRepository, która nie zawiera save(…) i delete(…) metod CrudRepository.

Rozwiązaniem tych wad jest stworzenie własnego interfejsu bazowego repozytorium lub nawet ich zestawu. W wielu zastosowaniach widzieliśmy coś takiego:

interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { }

interface ReadOnlyRepository<T> extends Repository<T, Long> {

  // Al finder methods go here
}

Pierwsze repozytorium interfejs jest pewnym ogólnym interfejsem bazowym, który w rzeczywistości naprawia tylko punkt 1, ale także wiąże Typ ID Long dla spójności. Drugi interfejs ma zwykle wszystkie metody find…(…) skopiowane z CrudRepository i PagingAndSortingRepository, ale nie ujawnia manipulujących. Więcej informacji na temat tego podejścia można znaleźć w dokumentacji referencyjnej .

Streszczenie-tl; dr

Abstrakcja repozytorium pozwala wybrać repozytorium bazowe całkowicie napędzane przez Ciebie architektoniczne i funkcjonalne potrzeb. Użyj tych dostarczonych po wyjęciu z pudełka, jeśli pasują, stwórz własne interfejsy bazy repozytoriów, jeśli to konieczne. Trzymaj się z dala od interfejsów repozytorium sklepu, chyba że jest to nieuniknione.

 287
Author: Oliver Gierke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-02 11:11:09

Tutaj wpisz opis obrazka

Podsumowanie:

  • PagingAndSortingRepository extends CrudRepository

  • JpaRepository rozszerza PagingAndSortingRepository

Interfejs crudrepository zapewnia metody operacji CRUD, dzięki czemu pozwala na tworzenie, odczyt, aktualizację i usuwanie rekordów bez konieczności definiowania własnych metod.

The PagingAndSortingRepository zapewnia dodatkowe metody pobierania podmioty korzystające z paginacji i sortowania.

Na koniec JpaRepository Dodać więcej funkcji specyficznych dla JPA.

 22
Author: Joby Wilson Mathews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-12 18:13:29