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
| Symfony / Doctrine | Spring Boot / JPA |
|---|---|
DATABASE_URL dans .env | spring.datasource.url dans application.properties |
doctrine.yaml | propriétés spring.jpa.* dans application.properties |
| MariaDB/MySQL | MySQL (même syntaxe SQL) |
make:migration | Flyway (séance 509) |
php bin/console doctrine:database:create | Cré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
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
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 :
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
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.
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.