# Migration vers Hibernate (sans Flyway) ## 📋 Résumé des changements Ce document explique les modifications apportées pour **désactiver Flyway** et laisser **Hibernate gérer automatiquement** la création des tables et le chargement des données. --- ## ✅ Changements effectués ### 1. **Configuration Hibernate** (`application.properties`) #### Avant : ```properties quarkus.hibernate-orm.database.generation=update quarkus.flyway.migrate-at-start=true quarkus.flyway.baseline-on-migrate=true quarkus.flyway.baseline-version=0 quarkus.flyway.locations=classpath:db/migration ``` #### Après : ```properties # Hibernate crée les tables automatiquement quarkus.hibernate-orm.database.generation=drop-and-create quarkus.hibernate-orm.log.sql=true # Flyway DÉSACTIVÉ - Hibernate gère le schéma quarkus.flyway.migrate-at-start=false ``` ### 2. **Fichier `import.sql` créé** Un nouveau fichier `src/main/resources/import.sql` a été créé. Ce fichier contient toutes les données de test et sera **automatiquement exécuté par Hibernate** après la création des tables. Le fichier contient : - ✅ Types de chantier - ✅ Clients (entreprises et particuliers ivoiriens) - ✅ Employés - ✅ Équipes - ✅ Affectation des employés aux équipes - ✅ Marques de matériel - ✅ Matériel BTP - ✅ Chantiers - ✅ Phases des chantiers - ✅ Devis et lignes de devis - ✅ Factures et lignes de factures --- ## 🚀 Comment ça fonctionne ? ### Cycle de démarrage de l'application : 1. **Hibernate démarre** et lit les entités JPA 2. **Hibernate crée les tables** automatiquement (`drop-and-create`) 3. **Hibernate exécute `import.sql`** pour charger les données 4. **L'application est prête** avec une base de données complète --- ## 🔧 Modes de génération Hibernate Vous pouvez ajuster le comportement avec la propriété `quarkus.hibernate-orm.database.generation` : | Mode | Description | Utilisation | |------|-------------|-------------| | `drop-and-create` | **Supprime et recrée** les tables à chaque démarrage | ✅ **Développement** (mode actuel) | | `update` | **Met à jour** le schéma sans supprimer les données | 🔄 Développement avec persistance | | `create` | **Crée** les tables si elles n'existent pas | 🆕 Premier démarrage | | `validate` | **Valide** le schéma sans modification | 🏭 **Production** | | `none` | **Aucune action** | 🚫 Gestion manuelle | --- ## 📝 Recommandations par environnement ### **Développement local** (actuel) ```properties quarkus.hibernate-orm.database.generation=drop-and-create quarkus.flyway.migrate-at-start=false ``` ✅ Les tables sont recréées à chaque démarrage avec les données de test ### **Tests** ```properties %test.quarkus.hibernate-orm.database.generation=drop-and-create %test.quarkus.flyway.migrate-at-start=false ``` ✅ Déjà configuré dans `application-test.yml` ### **Production** ```properties %prod.quarkus.hibernate-orm.database.generation=validate %prod.quarkus.flyway.migrate-at-start=false ``` ⚠️ **Important** : En production, utilisez `validate` pour éviter toute modification accidentelle du schéma --- ## 🗂️ Fichiers de migration Flyway (conservés) Les fichiers de migration Flyway dans `src/main/resources/db/migration/` sont **conservés** mais **non utilisés** : - `V1__Initial_schema.sql` - `V2__Sample_data.sql` - `V3__create_auth_tables.sql` - `V4__create_phase_templates_fixed.sql` - `V5__Ivorian_test_data.sql` Vous pouvez les supprimer si vous ne prévoyez pas de réactiver Flyway. --- ## 🔄 Pour réactiver Flyway (si nécessaire) Si vous souhaitez revenir à Flyway : 1. **Modifier `application.properties`** : ```properties quarkus.hibernate-orm.database.generation=validate quarkus.flyway.migrate-at-start=true quarkus.flyway.baseline-on-migrate=true quarkus.flyway.baseline-version=0 quarkus.flyway.locations=classpath:db/migration ``` 2. **Supprimer ou renommer `import.sql`** : ```bash mv src/main/resources/import.sql src/main/resources/import.sql.bak ``` --- ## 🧪 Tester la configuration ### Démarrer l'application : ```bash ./mvnw quarkus:dev ``` ### Vérifier les logs : Vous devriez voir dans les logs : ``` Hibernate: drop table if exists clients cascade Hibernate: drop table if exists chantiers cascade ... Hibernate: create table clients (...) Hibernate: create table chantiers (...) ... Hibernate: insert into types_chantier (...) Hibernate: insert into clients (...) ... ``` ### Accéder à la console H2 (en développement) : ``` http://localhost:8080/q/dev ``` --- ## ❓ FAQ ### **Q : Pourquoi désactiver Flyway ?** **R :** Flyway et Hibernate peuvent entrer en conflit lorsqu'ils tentent tous deux de gérer le schéma de la base de données. En développement, Hibernate seul est plus simple et plus rapide. ### **Q : Les données sont-elles perdues à chaque redémarrage ?** **R :** Oui, avec `drop-and-create`. Pour conserver les données entre les redémarrages, utilisez `update` au lieu de `drop-and-create`. ### **Q : Comment passer en mode `update` ?** **R :** Modifiez `application.properties` : ```properties quarkus.hibernate-orm.database.generation=update ``` ### **Q : Le fichier `import.sql` est-il exécuté avec `update` ?** **R :** Oui, mais seulement au premier démarrage. Ensuite, il peut causer des erreurs de doublons. Pour éviter cela, commentez ou supprimez les lignes déjà insérées. ### **Q : Puis-je utiliser Hibernate en production ?** **R :** Oui, mais utilisez **`validate`** pour éviter toute modification du schéma. En production, il est recommandé de gérer les migrations avec Flyway ou Liquibase. --- ## 📚 Ressources - [Quarkus Hibernate ORM Guide](https://quarkus.io/guides/hibernate-orm) - [Quarkus Flyway Guide](https://quarkus.io/guides/flyway) - [Hibernate Schema Generation](https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#schema-generation) --- ## ✅ Résultat final Votre application démarre maintenant avec : - ✅ **Hibernate** crée automatiquement toutes les tables - ✅ **`import.sql`** charge automatiquement les données de test - ✅ **Flyway** est désactivé (pas de conflit) - ✅ **Base de données prête** avec des données réalistes pour le marché ivoirien Bon développement ! 🚀