Mise en place d’une base de données de test ou de démonstration

Problématique :

J'ai une application de test ou de démonstration et je ne veux pas être obligé d'installer une nouvelle base de donnée à chaque fois qu'un nouveau développeur arrive ou qu'il faut la déployer rapidement sur une nouvelle machine. De plus, la persistance réelle  des données n'est pas importante mais la base doit dans ce cas être réinitialisée à chaque fois.

Solution :

- Utilisation d'une base de donnée embarquée type HSQL, comme la persistance réelle des données n'est pas vraiment importante, on peut même utiliser le mode "en mémoire".

- Utilisation des fonctionnalités d'Hibernate pour la génération du schéma et l'exécution d'un script d'insertion de données.

Mise en oeuvre :

- Pour utiliser la base HSQL en mode mémoire il faut :

  1. Récupérer le jar HSQL, en ajoutant la dépendance suivante dans le pom.xml de l'application par exemple :

  2. <dependency>
    <groupId>hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <version>1.8.0</version>
    <dependency>

  3. Utiliser une URL de la forme : "jdbc:hsqldb:mem:mydb" dans le fichier de configuration de la session-factory ou de la datasource (Hibernate, Spring ou autres)

- Pour configurer Hibernate afin de générer automatiquement le schéma de la base il faut :

  1. Avoir un fichier de mapping Hibernate ou des annotations sur la classe pour chacun des beans du domaine
  2. Ajouter la propriété "hbm2ddl.auto" dans le fichier de configuration d'Hibernate (hibernate.cfg.xml ou un fichier spring en général) et lui donner la valeur "create".

- Pour importer automatiquement les données dans la base en mémoire il faut :

  1. Créer le script d'insertion des données en respectant bien la syntaxe SQL de HSQL (différente de MySQL par exemple)
  2. Nommer ce script "import.sql" et le rendre accessible à la racine du classpath lors du lancement de l'application, en le mettant dans src/main/resources par exemple.

Et voilà, le tour est joué, à chaque fois que la session Hibernate sera recréée (normalement au premier appel à la base après le démarrage de l'application), le schéma de la base sera généré à partir des informations de mapping et le script d'insertion sera exécuté juste après...

Problèmes rencontrés :

- Dans mon fichier d'insertion des données "import.sql", les caractères étaient encodés en UTF-8. La base de donnée en mémoire utilisant les paramètres d'encoding du serveur d'application, le résultat n'était pas le même qu'en utilisant une base MySQL.

-> La solution était de modifier les paramètres du serveur d'application, en ajoutant "-Dfile.encoding=UTF-8" dans les arguments de la VM au démarrage de Tomcat par exemple.

- La syntaxe des insertions de HSQL obligeant à répéter la commande et la liste des colonnes peut être pompeuse quand il s'agit d'un très grand nombre de lignes.

-> Pas de solution pour l'instant à part le copier/coller et le "replace all", mais si quelqu'un en connait une je suis preneur ;o)

En espérant que ça servira à quelqu'un, personnellement je trouve cela super pratique !!!!

Un commentaire

  1. Je ne savais pas qu’il est possible de lancer des scripts SQL automatiquement après la création de la base par hibernate.

    A noter : Dans le cas de ton application de test/démonstration, il est naturel de mettre le fichier import.sql dans src/main/resources. Par contre, pour d’autres types d’applications, ce fichier sera surement placé dans src/test/resources afin de l’utiliser uniquement pour les tests 😉

    Pour ce qui est d’éviter d’avoir à répéter la commande et la liste des colonnes, je pense qu’il doit exister des outils qui permettent de prendre un fichier au format csv (par exemple) et générer le fichier import.sql automatiquement.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.