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.
@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.
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.
findByNombre que Spring Data JPA implementa automáticamente.
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.
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().
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.
Para más detalles sobre el uso de @Repository en Spring Boot, consulta la documentación oficial de Spring.
Jorge García
Fullstack developer