Aller au contenu principal

Configurer la BD avec JPA

Notions théoriques

Spring Data JPA et Hibernate

Spring Data JPA est l'équivalent Spring Boot de Doctrine en Symfony. Il simplifie l'accès aux bases de données relationnelles en Java en s'appuyant sur :

  • JPA (Jakarta Persistence API) — la spécification standard Java pour la persistance
  • Hibernate — l'implémentation de JPA utilisée par défaut dans Spring Boot
Comparaison avec Symfony
Symfony / DoctrineSpring Boot / JPA
DATABASE_URL dans .envspring.datasource.url dans application.properties
doctrine.yamlpropriétés spring.jpa.* dans application.properties
MariaDB/MySQLMySQL (même syntaxe SQL)
make:migrationFlyway (séance 509)
php bin/console doctrine:database:createCréer la BDD manuellement ou avec Flyway

Configurer la connexion dans application.properties

# === Base de données ===
spring.datasource.url=jdbc:mysql://localhost:3306/monblog
spring.datasource.username=root
spring.datasource.password=

# Driver JDBC (auto-détecté, mais on peut le préciser)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# === Hibernate / JPA ===
# validate : vérifie que le schéma correspond aux entités (recommandé avec Flyway)
# update : met à jour le schéma automatiquement (dangereux en production)
# create : recrée le schéma à chaque démarrage (perd les données)
# none : ne fait rien
spring.jpa.hibernate.ddl-auto=validate

# Afficher les requêtes SQL générées dans la console (utile pour déboguer)
spring.jpa.show-sql=true

# Formater le SQL affiché
spring.jpa.properties.hibernate.format_sql=true
ddl-auto=validate avec Flyway

Quand vous utilisez Flyway pour gérer les migrations (séance 509), réglez toujours ddl-auto=validate. Hibernate vérifiera que le schéma de la base correspond aux entités, sans le modifier. Laissez Flyway gérer les changements de schéma.

N'utilisez jamais ddl-auto=create en production — cela efface toutes les données au démarrage.

Sécuriser les secrets avec un profil local

Le fichier application.properties est commité dans Git. Il ne doit pas contenir de mot de passe. La solution : un fichier application-local.properties non commité.

application.properties (commité, sans secrets) :

spring.application.name=MonBlog
server.port=8080

# Indique à Spring Boot de charger aussi application-local.properties
spring.profiles.active=local

spring.jpa.hibernate.ddl-auto=validate
spring.jpa.show-sql=true

application-local.properties (non commité, avec secrets) :

# === Secrets locaux — NE PAS COMMITTER ===
spring.datasource.url=jdbc:mysql://localhost:3306/monblog
spring.datasource.username=root
spring.datasource.password=monmotdepasse

.gitignore :

application-local.properties

Créer la base de données MySQL

Avant de lancer Spring Boot, créez la base de données :

-- Dans le terminal MySQL
CREATE DATABASE monblog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Ou depuis MySQL Workbench / DBeaver.

Vérifier la connexion au démarrage

Au lancement de Spring Boot (mvn spring-boot:run), regardez les logs. Si la connexion réussit, vous verrez :

HikariPool-1 - Start completed.

Si la connexion échoue :

Unable to acquire JDBC Connection

Vérifiez l'URL, le nom d'utilisateur et le mot de passe dans application-local.properties.

Pool de connexions HikariCP

Spring Boot utilise HikariCP comme pool de connexions par défaut. Il gère automatiquement un ensemble de connexions réutilisables, ce qui évite d'ouvrir et de fermer une connexion à chaque requête HTTP.

# Nombre de connexions dans le pool (défaut : 10)
spring.datasource.hikari.maximum-pool-size=10

# Timeout d'acquisition d'une connexion (ms)
spring.datasource.hikari.connection-timeout=30000

Exemple pratique

Configuration complète pour le projet MonBlog :

src/main/resources/application.properties

# Application
spring.application.name=MonBlog
server.port=8080

# Profil actif (charge application-local.properties)
spring.profiles.active=local

# JPA / Hibernate
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

# Dialecte MySQL (auto-détecté par Hibernate 6, mais préciser si besoin)
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect

src/main/resources/application-local.properties

# === NE PAS COMMITTER CE FICHIER ===
spring.datasource.url=jdbc:mysql://localhost:3306/monblog?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=

Commande MySQL pour créer la base :

CREATE DATABASE monblog
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

Test de mémorisation/compréhension


Quelle propriété configure l'URL de la base de données dans Spring Boot ?


Quelle valeur de ddl-auto vérifie le schéma sans le modifier (recommandée avec Flyway) ?


Quel pool de connexions Spring Boot utilise par défaut ?


Pourquoi ne pas committer application-local.properties dans Git ?


Quelle propriété affiche les requêtes SQL générées par Hibernate dans la console ?


TP pour réfléchir et résoudre des problèmes

Dans ce TP, vous allez configurer la connexion à MySQL pour le projet MonBlog.

Étape 1 — Créer la base de données

Connectez-vous à MySQL et créez la base de données :


Bonne pratique - Toujours préciser l'encodage

Spécifiez toujours CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci lors de la création de la base. utf8mb4 supporte les caractères Unicode complets (dont les emojis). utf8 en MySQL ne supporte pas les caractères 4 octets.

Étape 2 — Configurer application.properties


Bonne pratique - show-sql=true en développement uniquement

spring.jpa.show-sql=true est très utile pendant le développement pour voir quelles requêtes SQL Hibernate génère. En production, désactivez-le : afficher toutes les requêtes dans les logs dégrade les performances et peut exposer des données sensibles.

Étape 3 — Créer application-local.properties

Créez le fichier src/main/resources/application-local.properties avec vos secrets de connexion.


Bonne pratique - Profil Spring pour les environnements

Nommez les fichiers application-{profil}.properties pour gérer différents environnements : application-local.properties (développement local), application-prod.properties (production). Activez le bon profil avec spring.profiles.active=local.

📌 Une solution