Commencer à développer

Nous pouvons maintenant ouvrir le projet dans un IDE et commencer à développer.

Configurer une base de données embarquée

Pour assurer la persitance de nos entités, il faut faire appel à un SGBD supporté par Hibernate. Pour cela, un peu de configuration JDBC est nécessaire. Dans le fichier src/main/resources/library-config.properties, on définit

# Pour démarrer, on utilisera une base H2
hibernate.connection.url=jdbc:h2:file:target/db/h2data

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

# On demande à Hibernate de créer toutes les tables nécessaires
# au besoin
hibernate.hbm2ddl.auto=update

# Un peu de config pour savoir ce que fait hibernate, cette directive
# affiche toutes les requêtes effectuées sur la base dans la console
hibernate.show_sql=true

Sans oublier les dépendances nécessaires à l'exécution

<dependencies>
    ...

    <!-- Implémentation pour les logger -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>${sl4jVersion}</version>
      <scope>runtime</scope>
    </dependency>

    <!-- Driver pour la base de données H2 -->
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <version>${h2Version}</version>
    </dependency>

</dependencies>

Développer un premier service

Gestion des transactions

>>> Properties conf = new Properties();
URL url = Resource.getURL("TopiaContextImpl.properties");
conf.load(new FileInputStream(new File(url.toURI())));

Permet de charger un fichier contenant les informations de connexion à la base et de configuration de Topia.

>>> TopiaContext rootContext = TopiaContextFactory.getContext(conf);

Récupère le context de départ pour la création de sous context pour la gestion des entités.

>>> TopiaContext transaction = rootContext.beginTransaction();

Création d'un sous context pour la gestion des entités.

>>> transaction.commitTransaction();

Validation de l'état du context, les modifications des entités sont reportées dans la base de données.

>>> transaction.rollBackTransaction();

Invalidation de l'état du context, les modifications des entités ne sont pas reportées dans la base de données.

>>> transaction.closeContext();

Relâche la connexion JDBC d'un sous context et de ses sous contexts sans validation de l'état des contexts.

>>> rootContext.closeContext();

Relâche l'ensemble des ressources (cache, pools, ...) et relâche la connexion JDBC des sous contexts avec validation de l'état des contexts.

Manipulation des entités

>>> PersonDAO personDAO = <nom modele>DAOHelper.getPersonDAO(transaction);

Récupération d'un DAO pour accéder à une entité.

>>> Person person = personDAO.findByTopiaId(id);

Les méthodes find permettent de récupérer une ou plusieures entités selon différents critères.

>>> person.setName("tutu");

Manipulation de l'entité par les getters et setters.

>>> Person person = personDAO.create();

Création d'une entité. Si vous utilisez l'instanciation classique java avec le new, l'entité n'est pas persistée.

>>> personDAO.update(person);

Modification d'un entité.

>>> personDAO.delete(person);

Suppression d'une entité.

Configuration I18n

ToPIA contient une internationnalisation des messages utilisateurs (logs). Il est préférable d'initialiser I18n pour accélérer la recherche des messages.

Au démarrage de l'application

I18nInitializer i18nInitializer = new DefaultI18nInitializer("library-bundle");
I18n.init(i18nInitializer, new Locale("fr", "FR"));

Configuration maven

<!-- Plugin i18n pour gérer le bundle de messages -->
<plugin>
  <groupId>org.nuiton.i18n</groupId>
  <artifactId>i18n-maven-plugin</artifactId>
  <version>${nuitonI18nVersion}</version>
  <executions>
    <!-- Cette exécution permet de rassembler tous les messages i18n
         dans un seul 'properties bundle' nommé library-bundle
    -->
    <execution>
      <id>make-bundle</id>
      <configuration>
        <bundleOutputName>library-bundle</bundleOutputName>
      </configuration>
      <goals>
        <goal>bundle</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Vous pourrez également utiliser nuiton-i18n pour l'internationnalisation de votre application.

Exemple complet

Un exemple complet dans StartTest.