Aller au contenu principal

Quiz: Configuration Base de Données

Testez vos connaissances sur PostgreSQL, Hibernate et Lombok.

30 questions - Cliquez sur chaque question pour révéler la réponse.


Questions 1-10: PostgreSQL​

Question 1: Comment ajouter PostgreSQL à un projet Spring Boot?

Réponse:

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>

Question 2: Comment configurer la connexion PostgreSQL?

Réponse:

spring:
datasource:
url: jdbc:postgresql://localhost:5432/mydb
username: postgres
password: secret
driver-class-name: org.postgresql.Driver

Question 3: Comment lancer PostgreSQL avec Docker?

Réponse:

docker run -d \
--name postgres \
-e POSTGRES_DB=mydb \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=secret \
-p 5432:5432 \
postgres:15

Question 4: Quelle est la différence entre H2 et PostgreSQL?

Réponse:

H2PostgreSQL
En mémoire (par défaut)Persistant
Développement/TestsProduction
Aucune installationInstallation requise
Données perdues au redémarrageDonnées persistantes
LégerComplet et robuste

Question 5: Comment configurer le pool de connexions?

Réponse: Spring Boot utilise HikariCP par défaut:

spring:
datasource:
hikari:
maximum-pool-size: 10
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000

Question 6: Comment définir un schéma par défaut?

Réponse:

spring:
jpa:
properties:
hibernate:
default_schema: my_schema

Ou dans l'URL:

url: jdbc:postgresql://localhost:5432/mydb?currentSchema=my_schema

Question 7: Comment gérer les TimeZones avec PostgreSQL?

Réponse:

spring:
jpa:
properties:
hibernate:
jdbc:
time_zone: UTC

Recommandé: stocker en UTC, convertir à l'affichage.


Question 8: Comment configurer SSL pour PostgreSQL?

Réponse:

spring:
datasource:
url: jdbc:postgresql://host:5432/db?ssl=true&sslmode=require

Modes: disable, allow, prefer, require, verify-ca, verify-full


Question 9: Comment créer une base de données avec Docker Compose?

Réponse:

# 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:

Question 10: Comment externaliser les credentials de la base de données?

Réponse:

spring:
datasource:
url: ${DB_URL}
username: ${DB_USER}
password: ${DB_PASSWORD}

Définir les variables d'environnement:

export DB_URL=jdbc:postgresql://localhost/mydb
export DB_USER=postgres
export DB_PASSWORD=secret

Questions 11-20: Hibernate DDL​

Question 11: Qu'est-ce que hibernate.ddl-auto?

Réponse: Propriété qui contrôle la génération automatique du schéma:

ValeurComportement
noneAucune action
validateValide le schéma
updateMet à jour le schéma
createCrée le schéma (drop avant)
create-dropCrée et supprime à l'arrêt

Question 12: Quelle valeur utiliser en production?

Réponse: none ou validate

spring:
jpa:
hibernate:
ddl-auto: validate

En production, utiliser des outils de migration (Flyway, Liquibase).


Question 13: Comment Hibernate génère-t-il les noms de tables?

Réponse: Stratégie par défaut: camelCase vers snake_case

@Entity
public class UserProfile { }
// Table: user_profile

Personnaliser:

spring:
jpa:
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

Question 14: Comment spécifier le nom d'une table?

Réponse:

@Entity
@Table(name = "utilisateurs")
public class User {
// ...
}

Question 15: Comment spécifier le nom d'une colonne?

Réponse:

@Entity
public class User {

@Column(name = "nom_complet")
private String fullName;

@Column(name = "courriel", unique = true, nullable = false)
private String email;
}

Question 16: Comment définir une clé primaire auto-générée?

Réponse:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

// Stratégies:
// IDENTITY: auto-increment DB
// SEQUENCE: séquence DB
// TABLE: table de séquences
// AUTO: choix automatique

Question 17: Comment définir une contrainte unique?

Réponse:

// Sur une colonne
@Column(unique = true)
private String email;

// Sur plusieurs colonnes
@Table(uniqueConstraints = {
@UniqueConstraint(columnNames = {"firstName", "lastName"})
})
public class User { }

Question 18: Comment définir un index?

Réponse:

@Entity
@Table(indexes = {
@Index(name = "idx_email", columnList = "email"),
@Index(name = "idx_name", columnList = "lastName, firstName")
})
public class User { }

Question 19: Comment voir le SQL généré par Hibernate?

Réponse:

spring:
jpa:
show-sql: true
properties:
hibernate:
format_sql: true

logging:
level:
org.hibernate.SQL: DEBUG
org.hibernate.orm.jdbc.bind: TRACE

Question 20: Comment valider le schéma au démarrage?

Réponse:

spring:
jpa:
hibernate:
ddl-auto: validate

L'application échoue au démarrage si le schéma ne correspond pas aux entités.


Questions 21-30: Lombok​

Question 21: Qu'est-ce que Lombok?

Réponse: Bibliothèque qui génère du code répétitif via des annotations:

  • Getters/Setters
  • Constructeurs
  • equals/hashCode
  • toString
  • Builder

Réduit considérablement le boilerplate.


Question 22: Comment ajouter Lombok?

Réponse:

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>

Installer aussi le plugin IDE (IntelliJ, Eclipse).


Question 23: Comment générer les getters et setters?

Réponse:

@Getter
@Setter
public class User {
private Long id;
private String name;
}

// Génère:
// getId(), setId()
// getName(), setName()

Question 24: Qu'est-ce que @Data?

Réponse: Combine plusieurs annotations:

@Data  // = @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor
public class User {
private Long id;
private String name;
}

Question 25: Comment créer un builder?

Réponse:

@Builder
public class User {
private Long id;
private String name;
private String email;
}

// Usage:
User user = User.builder()
.name("John")
.email("john@example.com")
.build();

Question 26: Comment générer les constructeurs?

Réponse:

@NoArgsConstructor  // Constructeur vide
@AllArgsConstructor // Tous les champs
@RequiredArgsConstructor // Champs final et @NonNull
public class User {
private final Long id;
@NonNull
private String name;
private String email;
}

Question 27: Comment utiliser @Slf4j pour le logging?

Réponse:

@Slf4j
@Service
public class UserService {

public void process() {
log.info("Processing...");
log.debug("Details: {}", data);
log.error("Error occurred", exception);
}
}

Génère: private static final Logger log = LoggerFactory.getLogger(UserService.class);


Question 28: Comment exclure un champ de toString?

Réponse:

@ToString(exclude = "password")
public class User {
private String email;
private String password; // Exclu du toString
}

// Ou
@ToString.Exclude
private String password;

Question 29: Comment exclure un champ de equals/hashCode?

Réponse:

@EqualsAndHashCode(exclude = "orders")
public class User {
private Long id;
private List<Order> orders; // Exclu
}

// Ou
@EqualsAndHashCode.Exclude
private List<Order> orders;

Question 30: Quelles sont les bonnes pratiques avec Lombok et JPA?

Réponse:

  1. Éviter @Data sur les entités (problèmes avec lazy loading)
  2. Exclure les relations de equals/hashCode
  3. Utiliser @ToString.Exclude pour les relations bidirectionnelles
  4. Préférer @Getter et @Setter séparément
  5. Attention au @EqualsAndHashCode avec les entités
@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;
}

Score​

ScoreNiveau
27-30Excellent - Configuration maîtrisée
21-26Bien - Quelques révisions
15-20Moyen - Relisez les chapitres
Moins de 15À revoir

Retour au Module 4