Quiz: Configuración de Base de Datos
Ponga a prueba sus conocimientos sobre PostgreSQL, Hibernate y Lombok.
30 preguntas - Haga clic en cada pregunta para revelar la respuesta.
Preguntas 1-10: PostgreSQL
Pregunta 1: ¿Cómo agregar PostgreSQL a un proyecto Spring Boot?
Respuesta:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
Pregunta 2: ¿Cómo configurar la conexión a PostgreSQL?
Respuesta:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/mydb
username: postgres
password: secret
driver-class-name: org.postgresql.Driver
Pregunta 3: ¿Cómo iniciar PostgreSQL con Docker?
Respuesta:
docker run -d \
--name postgres \
-e POSTGRES_DB=mydb \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=secret \
-p 5432:5432 \
postgres:15
Pregunta 4: ¿Cuál es la diferencia entre H2 y PostgreSQL?
Respuesta:
| H2 | PostgreSQL |
|---|---|
| En memoria (por defecto) | Persistente |
| Desarrollo/Pruebas | Producción |
| Sin instalación | Requiere instalación |
| Datos perdidos al reiniciar | Datos persistentes |
| Ligero | Completo y robusto |
Pregunta 5: ¿Cómo configurar el pool de conexiones?
Respuesta: Spring Boot utiliza HikariCP por defecto:
spring:
datasource:
hikari:
maximum-pool-size: 10
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
Pregunta 6: ¿Cómo definir un esquema por defecto?
Respuesta:
spring:
jpa:
properties:
hibernate:
default_schema: my_schema
O en la URL:
url: jdbc:postgresql://localhost:5432/mydb?currentSchema=my_schema
Pregunta 7: ¿Cómo gestionar las zonas horarias (TimeZones) con PostgreSQL?
Respuesta:
spring:
jpa:
properties:
hibernate:
jdbc:
time_zone: UTC
Recomendado: almacenar en UTC, convertir al mostrar.
Pregunta 8: ¿Cómo configurar SSL para PostgreSQL?
Respuesta:
spring:
datasource:
url: jdbc:postgresql://host:5432/db?ssl=true&sslmode=require
Modos: disable, allow, prefer, require, verify-ca, verify-full
Pregunta 9: ¿Cómo crear una base de datos con Docker Compose?
Respuesta:
# docker-compose.yml
services:
db:
image: postgres:15
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
volumes:
- postgres-data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "5432:5432"
volumes:
postgres-data:
Pregunta 10: ¿Cómo externalizar las credenciales de la base de datos?
Respuesta:
spring:
datasource:
url: ${DB_URL}
username: ${DB_USER}
password: ${DB_PASSWORD}
Definir las variables de entorno:
export DB_URL=jdbc:postgresql://localhost/mydb
export DB_USER=postgres
export DB_PASSWORD=secret
Preguntas 11-20: Hibernate DDL
Pregunta 11: ¿Qué es hibernate.ddl-auto?
Respuesta: Propiedad que controla la generación automática del esquema:
| Valor | Comportamiento |
|---|---|
none | Ninguna acción |
validate | Valida el esquema |
update | Actualiza el esquema |
create | Crea el esquema (elimina antes) |
create-drop | Crea y elimina al detenerse |
Pregunta 12: ¿Qué valor usar en producción?
Respuesta: none o validate
spring:
jpa:
hibernate:
ddl-auto: validate
En producción, utilice herramientas de migración (Flyway, Liquibase).
Pregunta 13: ¿Cómo genera Hibernate los nombres de las tablas?
Respuesta: Estrategia por defecto: camelCase a snake_case
@Entity
public class UserProfile { }
// Table: user_profile
Personalizar:
spring:
jpa:
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Pregunta 14: ¿Cómo especificar el nombre de una tabla?
Respuesta:
@Entity
@Table(name = "utilisateurs")
public class User {
// ...
}
Pregunta 15: ¿Cómo especificar el nombre de una columna?
Respuesta:
@Entity
public class User {
@Column(name = "nom_complet")
private String fullName;
@Column(name = "courriel", unique = true, nullable = false)
private String email;
}
Pregunta 16: ¿Cómo definir una clave primaria autogenerada?
Respuesta:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// Estrategias:
// IDENTITY: auto-incremento en la BD
// SEQUENCE: secuencia en la BD
// TABLE: tabla de secuencias
// AUTO: elección automática
Pregunta 17: ¿Cómo definir una restricción única?
Respuesta:
// En una columna
@Column(unique = true)
private String email;
// En varias columnas
@Table(uniqueConstraints = {
@UniqueConstraint(columnNames = {"firstName", "lastName"})
})
public class User { }
Pregunta 18: ¿Cómo definir un índice?
Respuesta:
@Entity
@Table(indexes = {
@Index(name = "idx_email", columnList = "email"),
@Index(name = "idx_name", columnList = "lastName, firstName")
})
public class User { }
Pregunta 19: ¿Cómo ver el SQL generado por Hibernate?
Respuesta:
spring:
jpa:
show-sql: true
properties:
hibernate:
format_sql: true
logging:
level:
org.hibernate.SQL: DEBUG
org.hibernate.orm.jdbc.bind: TRACE
Pregunta 20: ¿Cómo validar el esquema al iniciar?
Respuesta:
spring:
jpa:
hibernate:
ddl-auto: validate
La aplicación falla al iniciar si el esquema no corresponde a las entidades.
Preguntas 21-30: Lombok
Pregunta 21: ¿Qué es Lombok?
Respuesta: Biblioteca que genera código repetitivo mediante anotaciones:
- Getters/Setters
- Constructores
- equals/hashCode
- toString
- Builder
Reduce considerablemente el boilerplate.
Pregunta 22: ¿Cómo agregar Lombok?
Respuesta:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
También instale el plugin para el IDE (IntelliJ, Eclipse).
Pregunta 23: ¿Cómo generar los getters y setters?
Respuesta:
@Getter
@Setter
public class User {
private Long id;
private String name;
}
// Genera:
// getId(), setId()
// getName(), setName()
Pregunta 24: ¿Qué es @Data?
Respuesta: Combina varias anotaciones:
@Data // = @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor
public class User {
private Long id;
private String name;
}
Pregunta 25: ¿Cómo crear un builder?
Respuesta:
@Builder
public class User {
private Long id;
private String name;
private String email;
}
// Uso:
User user = User.builder()
.name("John")
.email("john@example.com")
.build();
Pregunta 26: ¿Cómo generar los constructores?
Respuesta:
@NoArgsConstructor // Constructor vacío
@AllArgsConstructor // Todos los campos
@RequiredArgsConstructor // Campos final y @NonNull
public class User {
private final Long id;
@NonNull
private String name;
private String email;
}
Pregunta 27: ¿Cómo usar @Slf4j para logging?
Respuesta:
@Slf4j
@Service
public class UserService {
public void process() {
log.info("Processing...");
log.debug("Details: {}", data);
log.error("Error occurred", exception);
}
}
Genera: private static final Logger log = LoggerFactory.getLogger(UserService.class);
Pregunta 28: ¿Cómo excluir un campo de toString?
Respuesta:
@ToString(exclude = "password")
public class User {
private String email;
private String password; // Excluido de toString
}
// O
@ToString.Exclude
private String password;
Pregunta 29: ¿Cómo excluir un campo de equals/hashCode?
Respuesta:
@EqualsAndHashCode(exclude = "orders")
public class User {
private Long id;
private List<Order> orders; // Excluido
}
// O
@EqualsAndHashCode.Exclude
private List<Order> orders;
Pregunta 30: ¿Cuáles son las buenas prácticas con Lombok y JPA?
Respuesta:
- Evitar
@Dataen las entidades (problemas con lazy loading) - Excluir las relaciones de equals/hashCode
- Usar
@ToString.Excludepara relaciones bidireccionales - Preferir
@Gettery@Setterpor separado - Precaución con
@EqualsAndHashCodeen las entidades
@Entity
@Getter
@Setter
@NoArgsConstructor
@ToString(exclude = "orders")
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class User {
@Id
@EqualsAndHashCode.Include
private Long id;
@OneToMany(mappedBy = "user")
private List<Order> orders;
}
Puntaje
| Puntaje | Nivel |
|---|---|
| 27-30 | Excelente - Configuración dominada |
| 21-26 | Bien - Algunas revisiones |
| 15-20 | Medio - Repase los capítulos |
| Menos de 15 | A revisar |