Qual é a diferença entre CrudRepository e JpaRepository interfaces Primavera de dados JPA ?
Quando vejo os exemplos na web, vejo-os lá usados de forma intercambiável.
Qual a diferença entre eles?
Por que você gostaria de usar um sobre o outro?
java
spring
jpa
spring-data
spring-data-jpa
kseeker
fonte
fonte
Respostas:
JpaRepository
estendePagingAndSortingRepository
que por sua vez se estendeCrudRepository
.Suas principais funções são:
CrudRepository
fornece principalmente funções CRUD.PagingAndSortingRepository
fornece métodos para fazer paginação e classificação de registros.JpaRepository
fornece alguns métodos relacionados à JPA, como liberar o contexto de persistência e excluir registros em um lote.Por causa da herança mencionada acima,
JpaRepository
terá todas as funções deCrudRepository
ePagingAndSortingRepository
. Portanto, se você não precisa que o repositório tenha as funções fornecidas porJpaRepository
ePagingAndSortingRepository
, useCrudRepository
.fonte
A resposta de Ken está basicamente certa, mas eu gostaria de comentar "por que você quer usar um sobre o outro?" parte da sua pergunta.
Fundamentos
A interface base que você escolhe para o seu repositório tem dois propósitos principais. Primeiro, você permite que a infraestrutura do repositório do Spring Data encontre sua interface e inicie a criação do proxy para injetar instâncias da interface nos clientes. O segundo objetivo é atrair a funcionalidade necessária para a interface sem precisar declarar métodos extras.
As interfaces comuns
A biblioteca principal do Spring Data é fornecida com duas interfaces básicas que expõem um conjunto dedicado de funcionalidades:
CrudRepository
- métodos CRUDPagingAndSortingRepository
- métodos para paginação e classificação (estendeCrudRepository
)Interfaces específicas da loja
Os módulos de armazenamento individuais (por exemplo, para JPA ou MongoDB) expõem extensões específicas da loja dessas interfaces básicas para permitir o acesso a funcionalidades específicas da loja, como descarga ou lote dedicado, que levam em consideração alguns detalhes da loja. Um exemplo para isso é
deleteInBatch(…)
deJpaRepository
que é diferente dedelete(…)
, uma vez que utiliza uma consulta para excluir as entidades dadas, que é de maior performance, mas vem com o efeito colateral de não desencadeando as cascatas definida-APP (como os define especificações TI).Geralmente, recomendamos não usar essas interfaces básicas, pois elas expõem a tecnologia de persistência subjacente aos clientes e, assim, aumentam o acoplamento entre eles e o repositório. Além disso, você se afasta um pouco da definição original de um repositório que é basicamente "uma coleção de entidades". Então, se você puder, fique com
PagingAndSortingRepository
.Interfaces básicas do repositório customizado
A desvantagem de depender diretamente de uma das interfaces de base fornecidas é dupla. Ambos podem ser considerados teóricos, mas acho que são importantes:
Page
ouPageable
no seu código de qualquer maneira. O Spring Data não é diferente de nenhuma outra biblioteca de uso geral como o commons-lang ou o Goiaba. Contanto que forneça benefícios razoáveis, tudo bem.CrudRepository
, por exemplo , você expõe um conjunto completo de métodos de persistência de uma só vez. Provavelmente, isso também é bom na maioria das circunstâncias, mas você pode encontrar situações nas quais deseja obter um controle mais refinado sobre os métodos expostos, por exemplo, para criar umReadOnlyRepository
que não inclua os métodossave(…)
e .delete(…)
CrudRepository
A solução para essas duas desvantagens é criar sua própria interface de repositório base ou até um conjunto delas. Em muitas aplicações, já vi algo assim:
A primeira interface do repositório é uma interface básica de uso geral que, na verdade, apenas corrige o ponto 1, mas também vincula o tipo de ID a
Long
consistência. A segunda interface geralmente possui todos osfind…(…)
métodos copiadosCrudRepository
ePagingAndSortingRepository
não expõe os métodos de manipulação. Leia mais sobre essa abordagem na documentação de referência .Resumo - tl; dr
A abstração do repositório permite que você escolha o repositório base totalmente orientado por suas necessidades arquitetônicas e funcionais. Use os fornecidos imediatamente, se necessário, crie suas próprias interfaces de base de repositório, se necessário. Fique longe das interfaces específicas do repositório da loja, a menos que seja inevitável.
fonte
Resumo:
PagingAndSortingRepository estende CrudRepository
JpaRepository estende PagingAndSortingRepository
A interface CrudRepository fornece métodos para operações CRUD, permitindo criar, ler, atualizar e excluir registros sem precisar definir seus próprios métodos.
O PagingAndSortingRepository fornece métodos adicionais para recuperar entidades usando paginação e classificação.
Finalmente, o JpaRepository adiciona um pouco mais de funcionalidade específica ao JPA.
fonte
Estou aprendendo o Spring Data JPA. Isso pode ajudá-lo a:
fonte
Todas as respostas fornecem detalhes suficientes para a pergunta. No entanto, deixe-me acrescentar algo mais.
Por que estamos usando essas interfaces:
Qual interface faz o quê:
Quando usar qual interface:
De acordo com http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/
Geralmente, a melhor ideia é usar CrudRepository ou PagingAndSortingRepository, dependendo se você precisa de classificação e paginação ou não.
O JpaRepository deve ser evitado, se possível, porque vincula os repositórios à tecnologia de persistência JPA e, na maioria dos casos, você provavelmente nem usaria os métodos extras fornecidos por ele.
fonte