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:
| H2 | PostgreSQL |
|---|---|
| En mémoire (par défaut) | Persistant |
| Développement/Tests | Production |
| Aucune installation | Installation requise |
| Données perdues au redémarrage | Données persistantes |
| Léger | Complet 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:
| Valeur | Comportement |
|---|---|
none | Aucune action |
validate | Valide le schéma |
update | Met à jour le schéma |
create | Crée le schéma (drop avant) |
create-drop | Cré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:
- Éviter
@Datasur les entités (problèmes avec lazy loading) - Exclure les relations de equals/hashCode
- Utiliser
@ToString.Excludepour les relations bidirectionnelles - Préférer
@Getteret@Setterséparément - Attention au
@EqualsAndHashCodeavec 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
| Score | Niveau |
|---|---|
| 27-30 | Excellent - Configuration maîtrisée |
| 21-26 | Bien - Quelques révisions |
| 15-20 | Moyen - Relisez les chapitres |
| Moins de 15 | À revoir |