Chapitre 3: Hibernate et Stratégies DDL
Introduction
Question: Comment Hibernate crée-t-il les tables dans votre base de données?
Réponse: Grâce aux stratégies DDL (Data Definition Language).
Dans ce chapitre, vous allez comprendre:
- Ce qu'est Hibernate
- Les 5 stratégies DDL (
none,validate,update,create,create-drop) - Quand utiliser chaque stratégie
- Comment configurer Hibernate pour PostgreSQL
Qu'est-ce qu'Hibernate?
Définition
Hibernate est l'implémentation de JPA (Java Persistence API) utilisée par Spring Boot.
Analogie:
- JPA = Interface (le "quoi") 📄
- Hibernate = Implémentation (le "comment") ⚙️
Exemple:
// JPA définit l'interface
@Entity
public class Product { ... }
// Hibernate implémente le mapping
// Génère automatiquement le SQL
Rôle d'Hibernate
Hibernate gère automatiquement:
-
Mapping Objet-Relationnel (ORM)
- Classe Java ↔ Table SQL
- Attribut Java ↔ Colonne SQL
-
Génération SQL
findAll()→SELECT * FROM productssave()→INSERT INTO products ...
-
Gestion du Schéma
- Création/modification des tables (stratégies DDL)
Les 5 Stratégies DDL
Vue d'Ensemble
| Stratégie | Comportement | Usage recommandé |
|---|---|---|
| none | Aucune action | Production (avec Flyway/Liquibase) |
| validate | Valide le schéma, ne modifie rien | Production |
| update | Met à jour le schéma (ajoute seulement) | Développement |
| create | Recrée le schéma à chaque démarrage | Tests |
| create-drop | Crée au démarrage, supprime à l'arrêt | Tests |
1. ddl-auto: none
Comportement: Hibernate ne touche pas à la base de données.
Quand l'utiliser: En production avec des outils de migration (Flyway, Liquibase).
Configuration:
spring:
jpa:
hibernate:
ddl-auto: none
Exemple:
Démarrage de l'application...
→ Hibernate ne crée/modifie aucune table
→ Les tables doivent déjà exister
Avantages:
- ✅ Contrôle total du schéma
- ✅ Pas de surprises en production
Inconvénients:
- ❌ Vous devez gérer les migrations manuellement
2. ddl-auto: validate
Comportement: Hibernate valide que le schéma correspond aux entités, mais ne le modifie pas.
Quand l'utiliser: En production pour vérifier la cohérence.
Configuration:
spring:
jpa:
hibernate:
ddl-auto: validate
Exemple:
Démarrage de l'application...
→ Hibernate compare les entités avec les tables
→ Si différence → ERREUR et arrêt
Erreur typique:
Schema-validation: missing column [price] in table [products]
Avantages:
- ✅ Détecte les incohérences
- ✅ Sécurise le démarrage
Inconvénients:
- ❌ Ne corrige pas automatiquement
3. ddl-auto: update
Comportement: Hibernate met à jour le schéma (ajoute colonnes/tables, mais ne supprime jamais).
Quand l'utiliser: En développement.
Configuration:
spring:
jpa:
hibernate:
ddl-auto: update
Exemple:
Entité initiale:
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
}
Base de données:
CREATE TABLE products (
id BIGINT PRIMARY KEY,
name VARCHAR(255)
);
Modification de l'entité:
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
private Double price; // NOUVEAU
}
Démarrage de l'application:
ALTER TABLE products ADD COLUMN price DOUBLE PRECISION;
✅ Colonne ajoutée automatiquement!
Avantages:
- ✅ Pratique en développement
- ✅ Pas besoin de gérer le schéma manuellement
Inconvénients:
- ❌ Ne supprime pas les colonnes obsolètes
- ❌ Peut causer des incohérences à long terme
- ❌ DANGEREUX en production
4. ddl-auto: create
Comportement: Hibernate recrée toutes les tables à chaque démarrage (supprime et recrée).
Quand l'utiliser: Pour les tests automatisés.
Configuration:
spring:
jpa:
hibernate:
ddl-auto: create
Exemple:
Démarrage de l'application...
→ DROP TABLE products;
→ CREATE TABLE products (...);
→ Toutes les données sont PERDUES
Avantages:
- ✅ Schéma toujours propre
- ✅ Idéal pour tests
Inconvénients:
- ❌ PERTE TOTALE DES DONNÉES à chaque démarrage
- ❌ NE JAMAIS UTILISER EN PRODUCTION
5. ddl-auto: create-drop
Comportement: Comme create, mais supprime aussi les tables à l'arrêt de l'application.
Quand l'utiliser: Pour les tests unitaires/intégration.
Configuration:
spring:
jpa:
hibernate:
ddl-auto: create-drop
Exemple:
Démarrage de l'application...
→ DROP TABLE products;
→ CREATE TABLE products (...);
... tests ...
Arrêt de l'application...
→ DROP TABLE products;
Avantages:
- ✅ Environnement de test propre
- ✅ Aucune donnée résiduelle
Inconvénients:
- ❌ PERTE TOTALE DES DONNÉES
- ❌ NE JAMAIS UTILISER EN PRODUCTION
Configuration Complète pour PostgreSQL
Configuration Développement
Fichier: application-dev.yml
spring:
datasource:
url: jdbc:postgresql://localhost:5432/dev_db
username: postgres
password: ${DB_PASSWORD}
driver-class-name: org.postgresql.Driver
jpa:
hibernate:
ddl-auto: update # Pratique en dev
show-sql: true # Voir les requêtes
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
format_sql: true # Formater le SQL
Configuration Production
Fichier: application-prod.yml
spring:
datasource:
url: jdbc:postgresql://prod-server:5432/prod_db
username: prod_user
password: ${DB_PASSWORD}
driver-class-name: org.postgresql.Driver
jpa:
hibernate:
ddl-auto: validate # Validation uniquement
show-sql: false # Pas de logs SQL en prod
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
Configuration Tests
Fichier: application-test.yml
spring:
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
password:
jpa:
hibernate:
ddl-auto: create-drop # Nettoie après chaque test
show-sql: true
Dialectes Hibernate
Qu'est-ce qu'un Dialecte?
Un dialecte est l'adaptation d'Hibernate à une base de données spécifique.
Analogie: Comme les dialectes régionaux d'une langue (français de France vs français du Québec).
Dialectes Courants
| Base de Données | Dialecte Hibernate |
|---|---|
| PostgreSQL | org.hibernate.dialect.PostgreSQLDialect |
| MySQL 8+ | org.hibernate.dialect.MySQL8Dialect |
| SQL Server | org.hibernate.dialect.SQLServerDialect |
| Oracle 12c+ | org.hibernate.dialect.Oracle12cDialect |
| H2 | org.hibernate.dialect.H2Dialect |
| MariaDB | org.hibernate.dialect.MariaDBDialect |
Pourquoi Spécifier un Dialecte?
Exemple: Génération d'ID auto-incrémenté
PostgreSQL:
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY, -- PostgreSQL
name VARCHAR(255)
);
MySQL:
CREATE TABLE products (
id BIGINT AUTO_INCREMENT PRIMARY KEY, -- MySQL
name VARCHAR(255)
);
Sans dialecte: Hibernate ne sait pas quelle syntaxe utiliser.
Avec dialecte: Hibernate génère le bon SQL pour votre base de données.
Logs SQL et Débogage
Afficher les Requêtes SQL
Configuration:
spring:
jpa:
show-sql: true # Active les logs SQL
properties:
hibernate:
format_sql: true # Formatte le SQL pour lisibilité
Console:
Hibernate:
insert
into
products
(name, price, id)
values
(?, ?, ?)
Afficher les Valeurs des Paramètres
Configuration:
logging:
level:
org.hibernate.SQL: DEBUG # Logs SQL
org.hibernate.type.descriptor.sql.BasicBinder: TRACE # Valeurs des paramètres
Console:
Hibernate:
insert
into
products
(name, price, id)
values
(?, ?, ?)
binding parameter [1] as [VARCHAR] - [Laptop]
binding parameter [2] as [DOUBLE] - [999.99]
binding parameter [3] as [BIGINT] - [1]
Stratégies Recommandées
Résumé Visuel
Développement
↓
ddl-auto: update
show-sql: true
↓
Changements rapides
Tables créées automatiquement
---
Tests
↓
ddl-auto: create-drop
show-sql: true
↓
Environnement propre
Données effacées après tests
---
Production
↓
ddl-auto: validate (ou none)
show-sql: false
↓
Aucune modification automatique
Migrations gérées par Flyway/Liquibase
Erreurs Courantes
Erreur 1: Table Doesn't Exist
Erreur:
Table "products" doesn't exist
Cause: ddl-auto: none ou validate, mais les tables n'existent pas.
Solution: Utilisez ddl-auto: update ou créez les tables manuellement.
Erreur 2: Schema Mismatch
Erreur:
Schema-validation: missing column [price] in table [products]
Cause: ddl-auto: validate, mais l'entité et la table diffèrent.
Solution:
- Changez vers
updatetemporairement - Ou modifiez la table manuellement
Erreur 3: Data Lost After Restart
Erreur: Toutes mes données disparaissent au redémarrage!
Cause: ddl-auto: create ou create-drop.
Solution: Changez vers update ou validate.
Résumé
Points Clés
✅ Hibernate = Implémentation de JPA
✅ 5 stratégies DDL: none, validate, update, create, create-drop
✅ Développement: update
✅ Production: validate ou none + Flyway
✅ Tests: create-drop
✅ Dialecte: Adapte Hibernate à votre base de données
Checklist Stratégies DDL
| Environnement | Stratégie | show-sql |
|---|---|---|
| Développement | update | true |
| Tests | create-drop | true |
| Production | validate ou none | false |
Prochaine Étape
Maintenant que vous maîtrisez Hibernate, passons au Chapitre 4 pour découvrir Lombok et réduire le code boilerplate!