← Back to list

Spring — Comparativa entre Repositorios CRUD y JPA

¿Qué es un Repositorio?

Fernando Andrade · 2024-10-25 00:21 · 0 claps · 3.1 min read
#spring #crudrepository #jparepository #repositorios #dao
Open on Medium ↗
Wiki topics: CRY · Crypto & Web3

Spring — Comparativa entre Repositorios CRUD y JPA

¿Qué es un Repositorio?

Un repositorio es una abstracción que se utiliza para encapsular la lógica de acceso a datos. Proporciona una interfaz para interactuar con una fuente de datos (base de datos, sistema de archivos, servicios remotos, etc.) y es parte fundamental en la arquitectura de software, especialmente en aplicaciones que siguen el patrón Repository o DAO (Data Access Object).

Antes de Spring Data, los desarrolladores tenían que implementar manualmente interfaces y clases para cada entidad del dominio, lo que generaba una cantidad significativa de código repetitivo.

Objetivo principal: Separar la lógica de acceso a datos de la lógica de negocio.

Ventajas:

  • Aislar el código de negocio del código de persistencia.
  • Facilitar el testing, permitiendo la inyección de mocks o repositorios en memoria.
  • Hacer el código más mantenible y comprensible.

Patrón DAO (Data Access Object)

El patrón DAO es una abstracción (una simplificación de algo complejo) que se utiliza para separar la lógica de acceso a datos de la lógica de negocio. Este patrón se centra en la persistencia de datos y suele estar muy ligado a la estructura de la base de datos.

Un DAO típicamente maneja operaciones CRUD (Crear, Leer, Actualizar, Borrar) para una tabla específica de la base de datos. Por ejemplo, tener un UserDAO que maneje todas las operaciones relacionadas con la tabla de usuarios.

Patrón Repository

El patrón Repository también se utiliza para manejar la persistencia de datos, pero a un nivel más alto de abstracción. En lugar de estar directamente ligado a una tabla específica, un Repository maneja una colección de objetos del dominio (grupo de objetos que representan entidades del negocio) y puede interactuar con múltiples fuentes de datos. Este patrón es más flexible y puede trabajar con diferentes tipos de almacenamiento, no solo bases de datos, por ejemplo: Servicios REST, NoSQL, archivos, cachés.

El término “abstracción” se utilizaen en lugar de “simplificación” porque “abstracción” implica no solo simplificar, sino también enfocar en los aspectos esenciales y ocultar los detalles innecesarios. Es un concepto más amplio y técnico que se usa mucho en programación y diseño de sistemas para representar ideas complejas de manera más manejable y relevante para el contexto.

Spring Data y Repositorios Automáticos

Spring Data surge como una solución para eliminar la necesidad de escribir implementaciones manuales para cada repositorio. Lo único que necesita hacer es definir una interfaz que extienda alguna de las interfaces de Spring Data (como CrudRepository o JpaRepository), y Spring genera la implementación automáticamente en tiempo de ejecución.

  • CrudRepository: Interfaz base en Spring Data, proporciona métodos básicos para CRUD (Create, Read, Update, Delete).
  • JpaRepository: Una extensión de CrudRepositoryque añade funcionalidades adicionales para manejar JPA (Java Persistence API), como paginación y ordenamiento.

Implementación de un Repositorio usando CrudRepository

Un ejemplo básico donde se implementa un repositorio para manejar la entidad Poll en una aplicación de encuestas.

package com.ejemplo.repository;

import org.springframework.data.repository.CrudRepository;
import com.ejemplo.domain.Poll;

public interface PollRepository extends CrudRepository<Poll, Long> {
}

PollRepository hereda de CrudRepository y automáticamente tiene métodos como save(), findById(), findAll(), delete(), etc.

Métodos clave en CrudRepository:

  • save(S entity): Guarda o actualiza una entidad.
  • findById(ID id): Encuentra una entidad por su identificador.
  • findAll(): Recupera todas las entidades.
  • deleteById(ID id): Elimina una entidad por su identificador.

Comparación: CrudRepository vs JpaRepository

Ambas interfaces ofrecen una manera de abstraer la persistencia de datos, pero tienen diferencias importantes.

Métodos CRUD

  • CrudRepository: Proporciona métodos CRUD básicos.
  • JpaRepository: Hereda todos los métodos de CrudRepository.

Funcionalidades

  • CrudRepository: Básico, solo operaciones CRUD.
  • JpaRepository: Funciones avanzadas: paginación, ordenamiento, flush.

Compatibilidad

  • CrudRepository: Usado en cualquier tipo de persistencia.
  • JpaRepository: Optimizado para JPA y persistencia en bases de datos relacionales.

Ejemplo con JpaRepository:

import org.springframework.data.jpa.repository.JpaRepository;
import com.ejemplo.domain.Poll;

public interface PollRepository extends JpaRepository<Poll, Long> {
}

En este caso, JpaRepository agrega métodos útiles como findAll(Pageable pageable) y flush().

Ventajas de JpaRepository:

  • Paginación y Ordenamiento: Si la aplicación maneja grandes volúmenes de datos, JpaRepository permite obtener subconjuntos de resultados (por ejemplo, para paginar).
  • Métodos adicionales: Más métodos para manejar relaciones de base de datos y optimizaciones propias de JPA.

¿Cuál elegir?

  • Si la aplicación solo requiere operaciones CRUD simples, CrudRepository es más que suficiente. Es ligero y fácil de usar.
  • Si necesita funcionalidades más avanzadas como paginación, ordenamiento y un control más preciso sobre las transacciones, JpaRepository es la opción adecuada.

Buenas prácticas en el uso de Repositorios

Un repositorio por entidad: Es recomendable tener un repositorio separado para cada entidad del dominio.

Métodos de búsqueda personalizados: Si necesita búsquedas más complejas (por ejemplo, encontrar encuestas por fecha o por autor), puede definir métodos personalizados como findByAuthor() o findByDate().

  • Ejemplo:
List<Poll> findByAuthor(String author);

Fuente: Spring REST Building Java Microservices and Cloud Applications — Balaji Varanasi y Maxim Bartkov


메타데이터
post_id
3f4c79f446c8
slug
spring-comparativa-entre-repositorios-crud-y-jpa-3f4c79f446c8
url
https://medium.com/@ingenieroandrade/spring-comparativa-entre-repositorios-crud-y-jpa-3f4c79f446c8
canonical_url
https://medium.com/@ingenieroandrade/spring-comparativa-entre-repositorios-crud-y-jpa-3f4c79f446c8
author_url
https://medium.com/@ingenieroandrade
status
ok
fetched_at
2026-09-01 12:46:07