Saltar al contenido principal

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:

H2PostgreSQL
En memoria (por defecto)Persistente
Desarrollo/PruebasProducción
Sin instalaciónRequiere instalación
Datos perdidos al reiniciarDatos persistentes
LigeroCompleto 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:

ValorComportamiento
noneNinguna acción
validateValida el esquema
updateActualiza el esquema
createCrea el esquema (elimina antes)
create-dropCrea 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:

  1. Evitar @Data en las entidades (problemas con lazy loading)
  2. Excluir las relaciones de equals/hashCode
  3. Usar @ToString.Exclude para relaciones bidireccionales
  4. Preferir @Getter y @Setter por separado
  5. Precaución con @EqualsAndHashCode en 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​

PuntajeNivel
27-30Excelente - Configuración dominada
21-26Bien - Algunas revisiones
15-20Medio - Repase los capítulos
Menos de 15A revisar

Volver al Módulo 4