Volver a la página principal
martes 1 octubre 2024
54

Cómo definir repositorios con @Repository en Spring Boot

La anotación @Repository en Spring Boot se utiliza para indicar que una clase es responsable de la interacción con la base de datos. Es una especialización de @Component que se aplica a la capa de persistencia, facilitando la captura de excepciones y la integración con herramientas ORM (Object Relational Mapping) como JPA o Hibernate. Las clases anotadas con @Repository gestionan el acceso a los datos y realizan operaciones como consultas, inserciones, actualizaciones y eliminaciones.

¿Qué es @Repository en Spring Boot?

@Repository es una anotación de Spring que se usa para marcar una clase como un repositorio de persistencia. Esta anotación forma parte del patrón de diseño DAO (Data Access Object), que se encarga de la capa de persistencia en aplicaciones Java. Al igual que @Service y @Controller, @Repository es una especialización de @Component, pero con un propósito específico: indicar que la clase gestiona las operaciones de acceso a datos.

Una de las características principales de @Repository es que, al aplicarse a las clases que interactúan con la base de datos, Spring la utiliza para capturar excepciones relacionadas con la base de datos y convertirlas en excepciones no verificadas (unchecked exceptions), simplificando el manejo de errores y evitando el uso explícito de try-catch en la lógica de negocio.

Ejemplos de uso de @Repository en Spring Boot

1. Crear un repositorio con @Repository usando Spring Data JPA

Cuando se trabaja con Spring Data JPA, no es necesario implementar métodos manualmente. Se puede extender de JpaRepository y usar @Repository para marcar la clase:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

// Entidad representada por la clase Usuario
@Repository
public interface UsuarioRepositorio extends JpaRepository<Usuario, Long> {
    // Definir métodos personalizados si es necesario
    Usuario findByNombre(String nombre);
}

En este ejemplo:

  • UsuarioRepositorio extiende JpaRepository, lo que proporciona métodos CRUD listos para usar.
  • @Repository indica que UsuarioRepositorio es un repositorio de persistencia.
  • Se define un método personalizado findByNombre que Spring Data JPA implementa automáticamente.

2. Definir un repositorio manualmente con @Repository

Si necesitas implementar un repositorio con lógica personalizada, puedes usar @Repository directamente en una clase:

import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;

@Repository
public class UsuarioRepositorioPersonalizado {

    @PersistenceContext
    private EntityManager entityManager;

    public List<Usuario> obtenerTodosLosUsuarios() {
        String consulta = "SELECT u FROM Usuario u";
        return entityManager.createQuery(consulta, Usuario.class).getResultList();
    }
}

En este caso:

  • @Repository marca UsuarioRepositorioPersonalizado como un componente de persistencia.
  • EntityManager se usa para ejecutar consultas SQL personalizadas en lugar de utilizar los métodos predefinidos de JpaRepository.

3. Inyectar un repositorio en un servicio

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UsuarioServicio {

    private final UsuarioRepositorio usuarioRepositorio;

    @Autowired
    public UsuarioServicio(UsuarioRepositorio usuarioRepositorio) {
        this.usuarioRepositorio = usuarioRepositorio;
    }

    public List<Usuario> listarUsuarios() {
        return usuarioRepositorio.findAll();
    }
}

En este ejemplo:

  • UsuarioServicio utiliza el repositorio UsuarioRepositorio para interactuar con la base de datos.
  • @Autowired se emplea para inyectar el repositorio y aprovechar los métodos proporcionados por JpaRepository como findAll().

Diferencias entre @Repository, @Service y @Component

Aunque @Repository es funcionalmente similar a @Component, se recomienda usar @Repository para cualquier clase que gestione la interacción con la base de datos. Esto ayuda a mantener la arquitectura de la aplicación limpia y proporciona semántica adicional para indicar la responsabilidad de la clase.

  • @Repository: Para clases que manejan la lógica de persistencia (interacciones con la base de datos).
  • @Service: Para clases que contienen la lógica de negocio.
  • @Component: Para cualquier componente genérico que no encaje en @Service, @Repository o @Controller.

Referencia oficial

Para más detalles sobre el uso de @Repository en Spring Boot, consulta la documentación oficial de Spring.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer