¿Cuál es la diferencia entre las interfaces CrudRepository y JpaRepository en Spring Data JPA?

Cuál es la diferencia entre Repositorio Crud y JpaRepositorio interfaces en JPA de datos de primavera?

Cuando veo los ejemplos en la web, veo que se usan indistintamente.

¿Cuál es la diferencia entre ellos?

¿Por qué querrías usar uno sobre el otro?

preguntado el 23 de diciembre de 12 a las 19:12

Lea también la sección de este artículo Introducción a los repositorios de datos de Spring -

7 Respuestas

JpaRepository Se extiende PagingAndSortingRepository que a su vez se extiende CrudRepository.

Sus principales funciones son:

  • CrudRepository proporciona principalmente funciones CRUD.
  • PagingAndSortingRepository proporciona métodos para realizar la paginación y la clasificación de registros.
  • JpaRepository proporciona algunos métodos relacionados con JPA, como vaciar el contexto de persistencia y eliminar registros en un lote.

Debido a la herencia mencionada anteriormente, JpaRepository tendrá todas las funciones de CrudRepository y PagingAndSortingRepository. Entonces, si no necesita el repositorio para tener las funciones provistas por JpaRepository y PagingAndSortingRepository , Utilizar CrudRepository.

Respondido 04 Abr '21, 16:04

y devuelve una Lista<> en lugar de Iterable<> en findAll() :-) - Hinotori

La respuesta de Ken es básicamente correcta, pero me gustaría intervenir en el "¿por qué querrías usar uno sobre el otro?" parte de tu pregunta

Eavor-Loop™

La interfaz base que elija para su repositorio tiene dos propósitos principales. Primero, permite que la infraestructura del repositorio de Spring Data encuentre su interfaz y active la creación del proxy para que inyecte instancias de la interfaz en los clientes. El segundo propósito es obtener tanta funcionalidad como sea necesario en la interfaz sin tener que declarar métodos adicionales.

Las interfaces comunes

La biblioteca central de Spring Data se envía con dos interfaces básicas que exponen un conjunto dedicado de funcionalidades:

  • CrudRepository - Métodos CRUD
  • PagingAndSortingRepository - métodos de paginación y clasificación (extiende CrudRepository)

Interfaces específicas de la tienda

Los módulos de tienda individuales (p. ej., para JPA o MongoDB) exponen extensiones específicas de la tienda de estas interfaces base para permitir el acceso a funciones específicas de la tienda, como el vaciado o el procesamiento por lotes dedicado, que tienen en cuenta algunas características específicas de la tienda. Un ejemplo de esto es deleteInBatch(…) of JpaRepository que es diferente de delete(…) ya que utiliza una consulta para eliminar las entidades dadas, que es más eficaz pero tiene el efecto secundario de no activar las cascadas definidas por JPA (como lo define la especificación).

Generalmente recomendamos no utilizar estas interfaces base, ya que exponen la tecnología de persistencia subyacente a los clientes y, por lo tanto, refuerzan el acoplamiento entre ellos y el repositorio. Además, se aleja un poco de la definición original de repositorio, que es básicamente "una colección de entidades". Así que si puedes, quédate con PagingAndSortingRepository.

Interfaces base de repositorio personalizadas

La desventaja de depender directamente de una de las interfaces base provistas es doble. Ambos pueden considerarse teóricos, pero creo que es importante tenerlos en cuenta:

  1. Dependiendo de una interfaz de repositorio de Spring Data, la interfaz de su repositorio se acopla a la biblioteca. No creo que este sea un problema en particular, ya que probablemente usará abstracciones como Page or Pageable en su código de todos modos. Spring Data no es diferente de cualquier otra biblioteca de propósito general como commons-lang o Guava. Mientras proporcione un beneficio razonable, está bien.
  2. Extendiendo, por ejemplo, CrudRepository, expone un conjunto completo de métodos de persistencia a la vez. Esto probablemente también esté bien en la mayoría de las circunstancias, pero es posible que se encuentre con situaciones en las que le gustaría obtener un control más detallado sobre los métodos expuestos, por ejemplo, para crear un ReadOnlyRepository eso no incluye el save(…) y delete(…) métodos de CrudRepository.

La solución a estos dos inconvenientes es crear su propia interfaz de repositorio base o incluso un conjunto de ellos. En muchas aplicaciones he visto algo como esto:

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

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

  // Al finder methods go here
}

La primera interfaz del repositorio es una interfaz base de propósito general que en realidad solo corrige el punto 1 pero también vincula el tipo de ID para que sea Long por consistencia. La segunda interfaz suele tener todas las find…(…) métodos copiados de CrudRepository y PagingAndSortingRepository pero no expone a los manipuladores. Lea más sobre ese enfoque en el documentación de referencia.

Resumen - tl;dr

La abstracción del repositorio le permite elegir el repositorio base totalmente impulsado por sus necesidades arquitectónicas y funcionales. Utilice los que se proporcionan de fábrica si le convienen, elabore sus propias interfaces base de repositorio si es necesario. Manténgase alejado de las interfaces de repositorio específicas de la tienda a menos que sea inevitable.

Respondido 30 Oct 18, 10:10

enter image description here

Resumen:

  • PagingAndSortingRepository amplía CrudRepository

  • JpaRepository amplía PagingAndSortingRepository

La Repositorio Crud La interfaz proporciona métodos para operaciones CRUD, por lo que le permite crear, leer, actualizar y eliminar registros sin tener que definir sus propios métodos.

La Repositorio de paginación y clasificación proporciona métodos adicionales para recuperar entidades mediante paginación y clasificación.

Finalmente, el JpaRepositorio agregue algunas funciones más que sean específicas de JPA.

respondido 12 mar '18, 18:03

¿Qué pasa con "extiende Repositorio<>"? ¿Qué métodos tendrá? ¿Igual que CrudRepository? - s-kaczmarek

Estoy aprendiendo Spring Data JPA. Podría ayudarte: enter image description here

Respondido 24 ago 19, 06:08

Hola buen esquema. ¿Qué herramienta usas para generar este tipo de esquema, por favor? - Rozar Fabien

A continuación se muestran las diferencias entre CrudRepository y JpaRepository como:

CrudRepository

  1. CrudRepository es una interfaz base y amplía la Repository de la interfaz del.
  2. CrudRepository principalmente proporciona operaciones CRUD (Crear, Leer, Actualizar, Eliminar).
  3. Tipo de retorno de saveAll() el método es Iterable.
  4. Caso de uso: para realizar operaciones CRUD, defina la extensión del repositorio CrudRepository.

JpaRepository

  1. JpaRepository Se extiende PagingAndSortingRepository que se extiende CrudRepository.
  2. JpaRepository proporciona CRUD y operaciones de paginación, junto con métodos adicionales como flush(), saveAndFlush()y deleteInBatch(), etc.
  3. Tipo de retorno de saveAll() el método es un List.
  4. Caso de uso: para realizar CRUD y operaciones por lotes, defina las extensiones del repositorio JpaRepository.

Respondido 10 Jul 20, 11:07

Todas las respuestas proporcionan suficientes detalles a la pregunta. Sin embargo, permítanme agregar algo más.

¿Por qué estamos usando estas interfaces?

  • Permiten que Spring encuentre las interfaces de su repositorio y cree objetos proxy para ellos.
  • Le proporciona métodos que le permiten realizar algunas operaciones comunes (también puede definir su método personalizado). Me encanta esta característica porque crear un método (y definir la consulta y las declaraciones preparadas y luego ejecutar la consulta con el objeto de conexión) para hacer una operación simple realmente apesta.

Qué interfaz hace qué:

  • Repositorio Crud: proporciona funciones CRUD
  • Repositorio de paginación y clasificación: proporciona métodos para hacer paginación y ordenar registros
  • JpaRepositorio: proporciona métodos relacionados con JPA, como vaciar el contexto de persistencia y eliminar registros en un lote

Cuándo usar qué interfaz:

Según http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/

En general, la mejor idea es utilizar Repositorio Crud or Repositorio de paginación y clasificación dependiendo de si necesita ordenar y paginar o no.

La JpaRepositorio debe evitarse si es posible, porque vincula sus repositorios a la tecnología de persistencia JPA y, en la mayoría de los casos, probablemente ni siquiera usaría los métodos adicionales que proporciona.

Respondido 14 Feb 20, 15:02

Crud Repository es la interfaz base y actúa como una interfaz de marcador.

El repositorio JPA también amplía el repositorio PagingAndSorting. Proporciona todos los métodos que son útiles para implementar la paginación. Crud Repository no proporciona métodos para implementar paginación y clasificación

Puedes referirte - https://www.tutorialspoint.com/difference-between-crudrepository-and-jparepository-in-java#:~:text=Crud%20Repository%20is%20the%20base,acts%20as%20a%20marker%20interface.&text=JPA%20repository%20also%20extends%20the,for%20implementing%20pagination%20and%20sorting.

Respondido el 28 de Septiembre de 21 a las 08:09

CrudRepository no es una interfaz de marcador. baeldung.com/…. Además, hay muy pocas instancias (posiblemente 0) de comprobaciones en el código, por lo que tampoco actúa como tal. - Jens Schauder

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.