7.1 KiB
Migration UUID - Documentation UnionFlow
Vue d'ensemble
Ce document décrit la migration complète des identifiants de Long (BIGINT) vers UUID dans le projet UnionFlow, effectuée le 16 janvier 2025.
Contexte
Avant la migration
- Les entités utilisaient
PanacheEntityavec des IDs de typeLong(BIGSERIAL en PostgreSQL) - Les repositories utilisaient
PanacheRepository<Entity, Long> - Les DTOs utilisaient
UUIDpour les identifiants, nécessitant une conversion constante
Après la migration
- Toutes les entités utilisent
BaseEntityavec des IDs de typeUUID - Tous les repositories utilisent
BaseRepository<Entity>avecEntityManager - Les DTOs et entités utilisent directement
UUID, éliminant le besoin de conversion
Changements architecturaux
1. BaseEntity (remplace PanacheEntity)
Fichier: unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/entity/BaseEntity.java
@MappedSuperclass
public abstract class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
@Column(name = "id", updatable = false, nullable = false)
private UUID id;
// Champs d'audit communs...
}
Avantages:
- Génération automatique d'UUID par la base de données
- Pas de séquences à gérer
- Identifiants uniques globaux (pas seulement dans une table)
- Compatible avec les architectures distribuées
2. BaseRepository (remplace PanacheRepository)
Fichier: unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/repository/BaseRepository.java
Changements:
- Utilise
EntityManagerau lieu des méthodes Panache - Toutes les méthodes utilisent
UUIDau lieu deLong - Fournit les opérations CRUD de base avec UUID
Exemple:
@ApplicationScoped
public class MembreRepository extends BaseRepository<Membre> {
public MembreRepository() {
super(Membre.class);
}
public Optional<Membre> findByEmail(String email) {
TypedQuery<Membre> query = entityManager.createQuery(
"SELECT m FROM Membre m WHERE m.email = :email", Membre.class);
query.setParameter("email", email);
return query.getResultStream().findFirst();
}
}
3. Migrations de base de données
Fichier: unionflow-server-impl-quarkus/src/main/resources/db/migration/V1.3__Convert_Ids_To_UUID.sql
Étapes de migration:
- Suppression des contraintes de clés étrangères existantes
- Suppression des séquences (BIGSERIAL)
- Suppression des tables existantes
- Recréation des tables avec UUID comme clé primaire
- Recréation des clés étrangères avec UUID
- Recréation des index et contraintes
Tables migrées:
organisationsmembrescotisationsevenementsinscriptions_evenementdemandes_aide
Entités migrées
| Entité | Ancien ID | Nouveau ID | Repository |
|---|---|---|---|
| Organisation | Long | UUID | OrganisationRepository |
| Membre | Long | UUID | MembreRepository |
| Cotisation | Long | UUID | CotisationRepository |
| Evenement | Long | UUID | EvenementRepository |
| DemandeAide | Long | UUID | DemandeAideRepository |
| InscriptionEvenement | Long | UUID | (à créer si nécessaire) |
Services mis à jour
Services corrigés pour utiliser UUID:
MembreService- Toutes les méthodes utilisent UUIDCotisationService- Toutes les méthodes utilisent UUIDOrganisationService- Toutes les méthodes utilisent UUIDDemandeAideService- Converti de String vers UUIDEvenementService- Utilise UUID
Exemple de changement:
// Avant
public MembreDTO trouverParId(Long id) { ... }
// Après
public MembreDTO trouverParId(UUID id) { ... }
DTOs mis à jour
Tous les DTOs utilisent maintenant UUID directement:
MembreDTO.associationId: Long → UUIDCotisationDTO.membreId: Long → UUID- Tous les autres champs ID : Long → UUID
Classes dépréciées
IdConverter
Fichier: unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/util/IdConverter.java
Cette classe est maintenant @Deprecated car elle n'est plus nécessaire. Elle est conservée uniquement pour compatibilité avec d'éventuels anciens scripts de migration.
Action recommandée: Supprimer cette classe dans une version future (après vérification qu'elle n'est plus utilisée).
Tests
Tests à mettre à jour
Les tests qui utilisent encore Long ou des méthodes Panache doivent être mis à jour:
Fichiers concernés:
MembreServiceAdvancedSearchTest.java- Utilisepersist()etisPersistent()- Tous les tests d'intégration qui créent des entités avec des IDs Long
Exemple de correction:
// Avant
membre.persist();
if (membre.isPersistent()) { ... }
// Après
membreRepository.persist(membre);
if (membre.getId() != null) { ... }
Migration de données (si nécessaire)
Si vous avez des données existantes à migrer, vous devrez:
-
Créer une migration de données personnalisée qui:
- Génère des UUIDs pour chaque enregistrement existant
- Met à jour toutes les clés étrangères
- Préserve les relations entre entités
-
Exemple de script de migration:
-- Ajouter colonne temporaire
ALTER TABLE membres ADD COLUMN id_new UUID;
-- Générer UUIDs
UPDATE membres SET id_new = gen_random_uuid();
-- Mettre à jour les clés étrangères
UPDATE cotisations SET membre_id_new = (
SELECT id_new FROM membres WHERE membres.id = cotisations.membre_id
);
-- Remplacer les colonnes (étapes complexes avec contraintes)
-- ...
Avantages de la migration UUID
- Unicité globale: Les UUIDs sont uniques même entre différentes bases de données
- Sécurité: Plus difficile de deviner les IDs (pas de séquences prévisibles)
- Architecture distribuée: Compatible avec les systèmes distribués et microservices
- Pas de séquences: Pas besoin de gérer les séquences de base de données
- Cohérence: Les DTOs et entités utilisent le même type d'ID
Inconvénients
- Taille: UUID (16 bytes) vs Long (8 bytes)
- Performance: Les index sur UUID peuvent être légèrement plus lents que sur Long
- Lisibilité: Les UUIDs sont moins lisibles que les IDs numériques
Recommandations
- Index: Assurez-vous que tous les index nécessaires sont créés sur les colonnes UUID
- Performance: Surveillez les performances des requêtes avec UUID
- Tests: Mettez à jour tous les tests pour utiliser UUID
- Documentation: Mettez à jour la documentation API pour refléter l'utilisation d'UUID
Prochaines étapes
- ✅ Migration des entités vers BaseEntity
- ✅ Migration des repositories vers BaseRepository
- ✅ Création de la migration Flyway
- ⏳ Mise à jour des tests unitaires
- ⏳ Mise à jour de la documentation API
- ⏳ Vérification des performances
- ⏳ Suppression de IdConverter (après vérification)
Support
Pour toute question concernant cette migration, contactez l'équipe UnionFlow.
Date de migration: 16 janvier 2025
Version: 2.0
Auteur: UnionFlow Team