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?
3 answers
Jparepository rozszerza PagingAndSortingRepository , które z kolei rozszerza CrudRepository .
Ich główne funkcje to:
- CrudRepository dostarcza głównie funkcje CRUD.
- PagingAndSortingRepository zapewnia metody do paginacji i sortowania rekordów.
- JpaRepository zapewnia pewne metody związane z JPA, takie jak flushing the persistence context i usuwanie rekordów w Nr serii.
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
.
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 (extendsCrudRepository
)
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:
-
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
lubPageable
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. -
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 zawierasave(…)
idelete(…)
metodCrudRepository
.
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.
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
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.
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