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