SpringBoot: Spring Data JPA

SpringBoot
SpringBoot
Actualizado: 13/06/2025

¡Desbloquea el curso completo!

IA
Ejercicios
Certificado
Entrar

Spring Data JPA

Spring Data JPA representa una de las herramientas más utilizadas en el ecosistema Spring Boot para simplificar el acceso a datos relacionales. Esta tecnología elimina gran parte del código repetitivo que tradicionalmente requiere la persistencia de datos, permitiendo a los desarrolladores centrarse en la lógica de negocio en lugar de en los detalles técnicos de acceso a la base de datos.

¿Qué es Spring Data JPA?

Spring Data JPA es una abstracción que se construye sobre JPA (Java Persistence API), el estándar de Java para el mapeo objeto-relacional. Mientras que JPA define las especificaciones, Spring Data JPA proporciona una implementación que reduce significativamente la cantidad de código necesario para realizar operaciones básicas de CRUD (Create, Read, Update, Delete).

La principal ventaja de esta tecnología radica en su capacidad para generar automáticamente implementaciones de repositorios basándose únicamente en interfaces. Esto significa que puedes definir métodos de acceso a datos sin escribir su implementación, ya que Spring Data JPA se encarga de generarla automáticamente.

Configuración básica en Spring Boot

Spring Boot facilita enormemente la configuración de Spring Data JPA. Con las dependencias correctas en el archivo pom.xml, la configuración se realiza de forma automática:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

La configuración básica en application.properties es mínima:

spring.datasource.url=jdbc:h2:mem:testdb
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true

Esta configuración utiliza H2, una base de datos en memoria perfecta para desarrollo y pruebas, aunque en producción utilizarías bases de datos como PostgreSQL o MySQL.

Entidades JPA

Guarda tu progreso

Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.

Progreso guardado
Asistente IA
Ejercicios
Iniciar sesión gratis

Más de 25.000 desarrolladores ya confían en CertiDevs

Las entidades son clases Java que representan tablas en la base de datos. Spring Data JPA utiliza anotaciones para mapear estas clases con las estructuras de datos relacionales:

@Entity
@Table(name = "usuarios")
public class Usuario {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(nullable = false, unique = true)
    private String email;
    
    @Column(nullable = false)
    private String nombre;
    
    // Constructores, getters y setters
    public Usuario() {}
    
    public Usuario(String email, String nombre) {
        this.email = email;
        this.nombre = nombre;
    }
    
    // Getters y setters omitidos por brevedad
}

Las anotaciones principales que debes conocer son:

  • @Entity: Marca la clase como una entidad JPA
  • @Table: Especifica el nombre de la tabla en la base de datos
  • @Id: Identifica el campo como clave primaria
  • @GeneratedValue: Define la estrategia de generación automática del ID
  • @Column: Configura propiedades específicas de la columna

Repositorios Spring Data

Los repositorios son interfaces que definen los métodos de acceso a datos. Spring Data JPA proporciona varias interfaces base que puedes extender:

@Repository
public interface UsuarioRepository extends JpaRepository<Usuario, Long> {
    
    // Métodos de consulta derivados del nombre
    List<Usuario> findByNombre(String nombre);
    
    Optional<Usuario> findByEmail(String email);
    
    List<Usuario> findByNombreContaining(String texto);
    
    boolean existsByEmail(String email);
}

La interfaz JpaRepository<Usuario, Long> proporciona automáticamente métodos como:

  • save(): Para guardar o actualizar entidades
  • findById(): Para buscar por ID
  • findAll(): Para obtener todas las entidades
  • deleteById(): Para eliminar por ID
  • count(): Para contar registros

Consultas personalizadas

Cuando los métodos derivados no son suficientes, puedes definir consultas personalizadas usando la anotación @Query:

@Repository
public interface UsuarioRepository extends JpaRepository<Usuario, Long> {
    
    @Query("SELECT u FROM Usuario u WHERE u.nombre LIKE %:patron%")
    List<Usuario> buscarPorPatronNombre(@Param("patron") String patron);
    
    @Query(value = "SELECT * FROM usuarios WHERE email = ?1", nativeQuery = true)
    Optional<Usuario> buscarPorEmailNativo(String email);
    
    @Modifying
    @Query("UPDATE Usuario u SET u.nombre = :nuevoNombre WHERE u.id = :id")
    int actualizarNombre(@Param("id") Long id, @Param("nuevoNombre") String nuevoNombre);
}

Las consultas JPQL utilizan nombres de entidades y propiedades Java, mientras que las consultas nativas (nativeQuery = true) utilizan SQL estándar con nombres de tablas y columnas de la base de datos.

Uso en servicios

Los repositorios se inyectan en las clases de servicio donde implementas la lógica de negocio:

@Service
public class UsuarioService {
    
    private final UsuarioRepository usuarioRepository;
    
    public UsuarioService(UsuarioRepository usuarioRepository) {
        this.usuarioRepository = usuarioRepository;
    }
    
    public Usuario crearUsuario(String email, String nombre) {
        if (usuarioRepository.existsByEmail(email)) {
            throw new IllegalArgumentException("El email ya existe");
        }
        
        Usuario usuario = new Usuario(email, nombre);
        return usuarioRepository.save(usuario);
    }
    
    public List<Usuario> buscarUsuarios(String patron) {
        return usuarioRepository.findByNombreContaining(patron);
    }
    
    public Optional<Usuario> obtenerPorEmail(String email) {
        return usuarioRepository.findByEmail(email);
    }
}

Esta arquitectura separa claramente las responsabilidades: las entidades modelan los datos, los repositorios manejan la persistencia, y los servicios implementan la lógica de negocio.

Transacciones

Spring Data JPA maneja automáticamente las transacciones para operaciones simples, pero puedes controlarlas explícitamente usando @Transactional:

@Service
@Transactional
public class UsuarioService {
    
    @Transactional(readOnly = true)
    public List<Usuario> obtenerTodos() {
        return usuarioRepository.findAll();
    }
    
    @Transactional
    public Usuario actualizarUsuario(Long id, String nuevoNombre) {
        Usuario usuario = usuarioRepository.findById(id)
            .orElseThrow(() -> new EntityNotFoundException("Usuario no encontrado"));
        
        usuario.setNombre(nuevoNombre);
        return usuarioRepository.save(usuario);
    }
}

La anotación @Transactional garantiza que las operaciones se ejecuten dentro de una transacción de base de datos, proporcionando consistencia y permitiendo rollback en caso de errores.

Completa SpringBoot y certifícate

Únete a nuestra plataforma y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.

Asistente IA

Resuelve dudas al instante

Ejercicios

Practica con proyectos reales

Certificados

Valida tus conocimientos

Más de 25.000 desarrolladores ya se han certificado con CertiDevs

⭐⭐⭐⭐⭐
4.9/5 valoración