Saltar al contenido principal

Spring Data JPA

Configuración de Base de Datos, Datasource y Persistencia

Spring Data JPA es un módulo dentro del ecosistema Spring Data que proporciona una abstracción de alto nivel para gestionar la persistencia de datos relacionales reduciendo sustancialmente el código de acceso a datos.


1. ¿Qué es Spring Data y cómo se instala?

Spring Data busca estandarizar el acceso a bases de datos relacionales y NoSQL. Spring Data JPA extiende la especificación JPA para automatizar la creación de repositorios mediante interfaces.

1.1. Dependencias en Maven y Gradle

En Maven (pom.xml):

pom.xml
<dependencies>
<!-- Starter de Spring Data JPA (incluye Hibernate, Spring Data y JPA) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- Base de datos H2 para entorno de desarrollo/pruebas -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

<!-- Driver de PostgreSQL para producción/desarrollo relacional -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>

En Gradle (build.gradle):

build.gradle
dependencies {
// Dependencia de Spring Data JPA
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// Driver de base de datos H2
runtimeOnly 'com.h2database:h2'
// Driver de PostgreSQL
runtimeOnly 'org.postgresql:postgresql'
}
Comprobación de la Instalación de Dependencias de Persistencia

Una vez agregados los starters de Spring Data JPA y los drivers JDBC (h2 o postgresql), verifica que los artefactos de persistencia se descargaron e instalaron correctamente en tu repositorio local ejecutando:

  • Maven: ./mvnw clean install (o mvn clean install)
  • Gradle: ./gradlew build (o ./gradlew --refresh-dependencies)

Este procedimiento asegura que Hibernate, las especificaciones de Jakarta EE y los controladores de BD estén disponibles antes de arrancar la aplicación.


2. Desglose Detallado de application.properties

A continuación se analizan paso a paso las propiedades clave de configuración de persistencia para PostgreSQL y H2:

src/main/resources/application.properties
# ==========================================
# 1. CONFIGURACIÓN DE DATASOURCE (PostgreSQL)
# ==========================================
# URL de conexión JDBC hacia PostgreSQL (Host: localhost, Puerto: 5432, Base de datos: boardgame)
spring.datasource.url=jdbc:postgresql://localhost:5432/boardgame

# Usuario con permisos de lectura/escritura en PostgreSQL
spring.datasource.username=postgres

# Contraseña de la base de datos
spring.datasource.password=postgres

# Clase del driver JDBC oficial de PostgreSQL
spring.datasource.driver-class-name=org.postgresql.Driver

# Dialecto de Hibernate para optimizar las consultas SQL generadas hacia PostgreSQL
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect


# ==========================================
# 2. ALTERNATIVA: BASE DE DATOS H2 (En Memoria o Archivo)
# ==========================================
# Driver oficial para H2 Database
# spring.datasource.driver-class-name=org.h2.Driver

# Opción A: H2 en Memoria RAM
# spring.datasource.url=jdbc:h2:mem:db-kevin;DB_CLOSE_DELAY=-1

# Opción B: H2 Persistido en Archivo local (crea el archivo ./db-kevin.mv.db)
# spring.datasource.url=jdbc:h2:./db-kevin;DB_CLOSE_DELAY=-1

# Credenciales por defecto en H2
# spring.datasource.username=postgres
# spring.datasource.password=postgres


# ==========================================
# 3. GESTIÓN DE ESQUEMA CON HIBERNATE (ddl-auto)
# ==========================================
# Define la estrategia de generación automática del esquema DDL:
# - none: No realiza ninguna modificación en la BD.
# - validate: Valida que las tablas coincidan con las entidades JPA (falla si hay diferencias).
# - update: Actualiza la estructura de la base de datos agregando nuevas columnas o tablas sin borrar datos.
# - create: Crea el esquema al iniciar, borrando tablas previas si existían.
# - create-drop: Crea el esquema al iniciar la app y lo destruye completamente al cerrar la aplicación.
spring.jpa.hibernate.ddl-auto=create-drop


# ==========================================
# 4. INICIALIZACIÓN DE DATOS CON SCRIPTS SQL
# ==========================================
# Define cuándo deben ejecutarse los archivos schema.sql y data.sql:
# - always: Ejecuta los scripts SQL siempre durante el arranque.
# - never: Nunca ejecuta scripts SQL automáticos.
spring.sql.init.mode=always

# Muestra u oculta las sentencias SQL ejecutadas por Hibernate en la consola de logs
spring.jpa.show-sql=false

# Diferimiento de la inicialización del DataSource:
# Esta propiedad es fundamental. Al estar en 'true', fuerza a que Spring Boot espere a que Hibernate
# termine de crear las tablas (ddl-auto) ANTES de intentar ejecutar el archivo data.sql.
spring.jpa.defer-datasource-initialization=true


# ==========================================
# 5. CONSOLA WEB DE H2
# ==========================================
# Habilita la interfaz web interactiva para inspeccionar la base de datos H2 desde el navegador
spring.h2.console.enabled=true

# Ruta URI para ingresar a la consola de H2 (ejemplo: http://localhost:8080/h2-console)
spring.h2.console.path=/h2-console
¿Por qué es indispensable DB_CLOSE_DELAY=-1 en H2?

Por defecto, las bases de datos H2 en memoria eliminan todo su contenido y se destruyen en el instante en que la última conexión JDBC activa se cierra. Al colocar el parámetro ;DB_CLOSE_DELAY=-1 en la cadena de conexión JDBC (jdbc:h2:mem:db-kevin;DB_CLOSE_DELAY=-1), le indicamos a H2 que mantenga viva la base de datos en memoria durante toda la vida útil del proceso JVM de Spring Boot, evitando la pérdida prematura del esquema y datos iniciales.


3. Carga de Datos Iniciales con data.sql

Cuando spring.jpa.defer-datasource-initialization=true y spring.sql.init.mode=always están configurados, Spring Boot buscará automáticamente el archivo data.sql dentro de la carpeta src/main/resources/.

src/main/resources/data.sql
-- Script de datos iniciales ejecutado automáticamente al arrancar la aplicación
INSERT INTO usuarios (nombre, email) VALUES ('Kevin', 'kevin@icesi.edu.co');
INSERT INTO usuarios (nombre, email) VALUES ('Ana', 'ana@icesi.edu.co');
INSERT INTO usuarios (nombre, email) VALUES ('Carlos', 'carlos@icesi.edu.co');

Cuestionario de Autoevaluación

Cargando cuestionario...