Pages enfant
  • 3.3.3 Gestion de la structure de la base de données

Sommaire :


Introduction

Important : La gestion de la structure de la base de données est liée à la numérotation des versions de l'application (Cf. 3.3.6 Numérotation des versions)

Création de la structure de la base de données

Il est possible de configurer la couche JPA pour l'autoriser à automatiquement créer (où mettre à jour) la structure de la base de données. Ceci notamment parce que nous utilisons l'implémentation Hibernate de JPA qui offre cette fonctionnalité.

Pour activer activer la fonctionnalité il faut dans le fichier resources/properties/dao/dao.xml, positionner la propriété generateDdl à true :

<bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="${datasource.bean}" />
        <property name="jpaVendorAdapter">
            <bean>
                <property name="showSql" value="true" />
                <property name="generateDdl" value="#{ systemProperties[generateDdl]?:false }" />
                <property name="database" value="${jpa.database.type}" />
            </bean>
        </property>
        <property name="persistenceXmlLocation" value="classpath*:META-INF/example-dao-persistence.xml" />
        <property name="jpaProperties" ref="jpaProperties" />
    </bean>

En  fait, on voit ici que la propriété generateDdl du jpaVendorAdapter est évaluée via une EL Spring. Par défaut, sa valeur vaudra false. Ceci permet de NE PAS mettre à jour la base de données à chaque démarrage de l'application mais de le faire explicitement.

Pour cela ESUP-Commons propose un module batch dont une des commande sert à initialiser la base de données. L'appel à cette commande positionne la variable d'environnement generateDdl à true ce qui fait que la propriété generateDdl du jpaVendorAdapter est elle même positionnée à true.

La commande batch se lance via :

java -jar -Dconf=/chemin/conf.properties <appli>-batch-<version>.jar init-db

Où la variable d'environnement conf permet de pointer vers un fichier de configuration externe contenant les propriétés suivantes (exemple pour MySQL ici) :

  • jdbc.connection.driver_class=com.mysql.jdbc.Driver (le nom de la Classe pour le driver JDBC)
  • jdbc.connection.url=jdbc:mysql://localhost/test (la chaîne de connexion à la base)
  • jdbc.connection.username=root (le user)
  • jdbc.connection.password=admin (le mot de passe)
  • jpa.database.type=MYSQL (le type de la base. utilisé par JPA pour la génération du SQL)

Mise à jour de la structure de la base de données

Le principe est le même que pour la création de la base de données sauf que la commande à lancer est :

java -jar -Dconf=/chemin/conf.properties <appli>-batch-<version>.jar upgrade-db

Comment ça marche

Les exemples données ici sont consultables dans l'application esup-example.
Le module batch dépend du module example-domain-services pour avoir accès au VersionningService défini dans le fichier domain-services-init.xml du module demain-services.

Les commandes batch

La méthodeMaindispatche vers différente méthodes suivant le paramètre passé :

  • initDb pour init-db
  • upgradeDb pour upgrade-db

Respectivement ces méthodes appellent les méthodes suivantes du VersionningService :

  • initDatabase
  • upgradeDatabase

Le VersionningService est initialisé dans une méthode utilitaire quicom.mysql.jdbc.Driver positionne aussi la variable generateDdl.

Les procédures de mise à jour des données

LeVersionningServicea une méthode interne pour mettre à jour des données de la base (upgradeDatabaseIfNeeded). Elle permet de découper les traitements de mise à jour par version élémentaire. Il suffit ensuite de coder chaque mise à jour sous la forme d'une méthode avec une signature du typevoid upgrade0d0d1(0d0d1 pour 0.0.1 ou 0 dot 0 dot 1).
upgradeDatabase

  • Aucune étiquette