Aller au contenu principal

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:

  1. Mapping Objet-Relationnel (ORM)

    • Classe Java ↔ Table SQL
    • Attribut Java ↔ Colonne SQL
  2. Génération SQL

    • findAll() → SELECT * FROM products
    • save() → INSERT INTO products ...
  3. Gestion du Schéma

    • Création/modification des tables (stratégies DDL)

Les 5 Stratégies DDL​

Vue d'Ensemble​

StratégieComportementUsage recommandé
noneAucune actionProduction (avec Flyway/Liquibase)
validateValide le schéma, ne modifie rienProduction
updateMet à jour le schéma (ajoute seulement)Développement
createRecrée le schéma à chaque démarrageTests
create-dropCrée au démarrage, supprime à l'arrêtTests

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éesDialecte Hibernate
PostgreSQLorg.hibernate.dialect.PostgreSQLDialect
MySQL 8+org.hibernate.dialect.MySQL8Dialect
SQL Serverorg.hibernate.dialect.SQLServerDialect
Oracle 12c+org.hibernate.dialect.Oracle12cDialect
H2org.hibernate.dialect.H2Dialect
MariaDBorg.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 update temporairement
  • 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​

EnvironnementStratégieshow-sql
Développementupdatetrue
Testscreate-droptrue
Productionvalidate ou nonefalse

Prochaine Étape​

Maintenant que vous maîtrisez Hibernate, passons au Chapitre 4 pour découvrir Lombok et réduire le code boilerplate!

➡️ Chapitre 4: Lombok

⬅️ Chapitre précédent: Jakarta vs Javax

⬅️ Retour au Module 4