| Astuce | ||
|---|---|---|
| ||
Relecture RB |
Sommaire :
| 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 . Par contre, 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 à partir du mapping objets/relationnel. 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 :
| Bloc de code |
|---|
<bean id="jpaVendorAdapterentityManagerFactory" class class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <propertyLocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="${datasource.bean}" /> <property name="jpaVendorAdapter"> <bean> <property name="showSql" value="true" /> <property <property name="generateDdl" value="true#{ systemProperties[generateDdl]?:false }" /> <property <property name="database" value="${jpa.database.type}" /> </bean> |
...
</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 :
| Bloc de code | ||
|---|---|---|
| ||
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 :
| Bloc de code | ||
|---|---|---|
| ||
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).
upgradeDatabaseCette fonctionnalité n'est pas offerte actuellement par esup-commons V2.