ToPIA Migration Service (manual version)

ToPIA Migration Service est un module ToPIA chargé d'effectuer la migration d'une base de données existante sans perte de données.

Cette page décrit un second service de migration où c'est l'utilisateur qui indique les scripts sql à effectuer pour chaque changement de version.

Ce service est plus léger que le service automatique et a quelques restrictions :

  • un seul modèle à migrer
  • un callback unique est requis (celui écrit par l'utilisateur)

Configuration

Ce service doit disposer de quelques proprietés de configuration pour effectuer la migration d'une base de données.

Ces propriétés sont fournies au service via un TopiaContext et font donc partie de la configuration de l'application.

Configuration de la base de données

hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.connection.username=sa
hibernate.connection.password=
hibernate.connection.driver_class=org.h2.Driver

topia.persistence.directories=directory1,directory2
topia.persistence.classes=classImpl1,classImpl2

Ces informations servent à créer une configuration hibernate (qui contient les informations de connexion et les mappings de l'application).

Les lignes commencant par "hibernate" sont spécifiques à hibernate et au type de base de données utilisé. Les lignes suivantes sont spécifiques à ToPIA mais contiennent les mappings indispensable pour créer le schéma de la base de données après migration.

Configuration des anciens mappings

La configuration doit contenir ces propriétés :

topia.service.migration.mappingsdir=oldmappings
topia.service.migration.modelname=model

qui spécifie le répertoire de recherche des anciens mappings pour l'unique modèle.

Ce dossier contient ensuite un sous-dossier pour le modèle comportant chacun un sous-dossier par version par version (nommé X, X étant la version), avec pour chaque dossier, l'ensemble des mappings hibernate de cette version.

Exemple :

oldmappings/
   model1/
       1/
           Class1.hbm.xml
           Class2.hbm.xml
           Class3.hbm.xml
       2/
           Class1.hbm.xml
           Class2New.hbm.xml
           Class3.hbm.xml
       2.2/
           Class2.hbm.xml
           Class3.hbm.xml
           Class4New.hbm.xml

Configuration de la version

La configuration doit contenir une propriété :

topia.service.migration.version=3.5.1 (exemple)

Cette propriété renseigne la version courante de l'application. Le modèle de classes doit contenir un tag "version" indiquant la version courante du modèle.

Lors de la migration ces deux versions seront comparées pour déterminer les mappings à utiliser.

Plus précisement, on cherche à partir des anciens mappings quelles versions peuvent être appliquées entre la version de la base et la version de l'application.

Configuration du callback

On doit définir une classe de type ManualMigrationCallback, pour donner les les actions à réaliser pour chaque migration de version. Dans ce callback, l'utilisateur doit indiquer s'il faut migrer la base de données.

Ce callback doit implémenter ManualMigrationCallback et se trouver dans la configuration:

topia.service.migration.callbackhandler=org.nuiton.test.MyMigrationCallback

Configuration du service

Enfin pour utiliser le service, il faut l'activer. La configuration doit contenir la propriétés suivante :

topia.service.migration=org.nuiton.topia.migration.ManualMigrationEngine

Contrôler la migration

Il est possible de ne pas déclancher automatiquement le service de migration au démarrage du service, cela peut être utile lorsque l'on veut effectuer des tâches sur la base avant d'effectuer une éventuelle migration.

Pour bloquer la migration au démarrage, on ajoute dans la configuration de ToPIA

topia.service.migration.migrate.on.init=false

Il est ensuite possible de récupérer le service de migration et d'effectuer la migration à partir d'un topiaContext :

ManualMigrationEngine service = (ManualMigrationEngine) ctxt.getService(TopiaMigrationService.class);
service.doMigrateSchema();

Utilisation

Ce module étant un service ToPIA, il doit être activé pour pouvoir s'exécuter.

Il commence par se connecter au SGBD, vérifie si les versions diffèrent, et effectue la migration si besoin.

Dans le cas où la version ne peut pas être deterninée, il considère que le schema en base est en version V0 (les mppings de cette version doivent être fournit). Dans ce cas, il effectue en plus une détection des tables pour savoir si le schéma existe deja. S'il n'existe pas, il ne tente donc pas d'effetuer une migration.

Callback de migration

Pour savoir comment migrer les données, le développeur doit écrire une méthode par version de base, donc on doit avoir autant de méthodes que de versions détectées dans les ancines mappings sauf pour la version V0.

Ces méthodes sont de la forme

migrateTo_XXX

où XXX est la version tranformée en identifiat java valide.

Exemple :

migrateTo_1_0_0 (pour la version 1.0.0)

Création de schéma

Dans le cas où l'application est ammenée à créer un schéma de base de données, ou à mettre à jour le schéma, elle doit en informer le module de migration pour que celui-ci renseigne la version du schéma créé.

Le module s'enregistre automatiquement aupres de ToPIA pour savoir quand celui-ci a créé un nouveau schéma. Il renseigne donc automatiquement la version par la suite.