Cours "Modèles pour la persistance des objets"

SGBDOO

Home (Contact)

Objectif du TP :

Utiliser un SGBDOO à partir d'un programme Java. Pour cet unique TP sur les SGBDOO nous utiliserons un SGBDOO simple et léger, db4o, qui convient pour les petits projets, en particulier pour les projets embarqués. Pour le moment db4o ne fonctionne qu'avec les programmes écrits en Java, C# et Visual Basic.

Support de cours


Télécharger et installer le SGBDOO

  1. Aller à l'URL http://community.versant.com/Downloads/db4o.aspx et téléchargez la dernière version stable (Stable Release) pour Java (pas la version pour .NET) du SDBDOO db4o, sous la forme d'un fichier ZIP. Il faut s'inscrire pour la télécharger (inscription gratuite). Ce TP a été testé avec la version 7.12 de db4o.
  2. Dézippez le fichier ZIP dans un répertoire quelconque.
  3. Si vous travaillez avec Eclipse ou NetBeans, créez une librairie qui contient le fichier jar "-all-java5" (ou le fichier dont le nom indique la version la plus récente par rapport à votre version de Java) qui se trouve dans le répertoire lib du fichier zip que vous avez récupéré. Dans cette librairie ajoutez une référence vers la javadoc qui est dans le répertoire doc/api du fichier ZIP. Si vous travaillez dans un autre environnement, arrangez-vous pour mettre ce fichier jar dans le classpath de l'application.
  4. Les ressources pour l'utilisation de Db4o, en particulier la javadoc et un tutoriel sur db4o. Index du manuel de référence de db4o.

Tester l'installation

  1. Pour tester votre installation, utilisez cette classe Personne et lancez la méthode main de cette classe. Etudiez le code de la méthode main ; simple, n'est-ce pas ? Ce qui est affiché vous surprend ? Il devrait s'afficher les informations sur la seule (?) personne âgée de 40 ans. Voyez-vous une différence avec JPA ?
  2. Que va-t-il se passer si vous relancez l'exécution ? Répondez avant de relancer l'exécution. Relancez l'exécution. Expliquez si vous aviez mal répondu. Pour bien vérifier, faites afficher tous les objets enregistrés dans la base.
  3. Ecrivez une classe Main1 dont la méthode main utilise les données déjà entrées dans la base pour faire afficher les informations sur les personnes avec un certain nom.

Correction

Explication pour question 2
Affichage de tous les objets enregistrés dans la base
Main1.java

Modification des données d'un objet simple - Requêtes natives

  1. Changez (dans la base) l'âge de Pierre Dupond, déjà dans la base. Attention à ne pas dupliquer des données.
  2. Recherchez toutes les personnes qui ont plus de 30 ans à l'aide d'une requête native.

Correction

Main2.java

Sauvegarde d'une facture - objets complexes

La facture :

Numéro : 08/5674 Date : 25/09/2008 Client : Roger Martin
Article Quantité PU Prix
S001 - Stylo Marker noir
8
40
320
L67 - Lot Ecriture
2
400
800
R987 - Ramette Laser 80g/m²
5
10
50
Prix total :
1170 €

Le lot L67 contient 10 stylos S001 et 10 ramettes R987, avec une réduction de 20%.

Récupérez ce code Java qui implémente ce diagramme de classes UML.

  1. Ecrivez une classe Main3 dont la méthode main crée la facture ci-dessus dans la base de données. Créez toutes les instances nécessaires. Faites afficher la facture avec la méthode toString de la classe Facture.
  2. Est-ce possible de sauvegarder cette facture dans une nouvelle base de donnée "facture.data", sans sauvegarder les produits concernés par la facture ? Comment ?
  3. Dans la classe Main3 sauvegardez toute la facture, avec les produits concernés. Dans la méthode main d'une classe AfficheBD, faites afficher toutes les factures et tous les articles de la base de données pour vérifier. Vous pourrez utiliser cette classe par la suite pour vérifier les données de la base en lançant la méthode main de la classe AfficheBD comme une application à part. Vous aurez peut-être (ça dépend de la version du JDK et db4o) des problèmes avec les classes Calendar et BigDecimal ; pour les résoudre, cherchez "BigDecimal" et "Calendar" voir dans le manuel de référence. Vous y trouverez aussi d'autres pitfalls (pièges en français) en cherchant "pitfalls". Et oui, c'est souvent plus simple qu'avec JPA, mais tout n'est pas si rose dans le monde de db4o...
  4. Ecrivez une nouvelle classe Main4 dont la méthode main récupère la facture sauvegardée avec une recherche par l'exemple (recherche par le numéro de la facture) et modifie le nombre de "Stylo Marker noir" indiqués sur la facture (ajoutez un stylo). Sauvegardez la nouvelle facture dans la base de données (avec store(facture)). Avant de fermer la base de données, vérifiez que la modification a bien été faite en faisant afficher le nombre de stylos de la facture par une recherche par l'exemple sur les lignes de facture. Vérifiez ensuite avec la classe AfficheBD. Si vous ne trouvez pas le même résultat, expliquez la raison (revoyez votre cours). Au lieu d'utiliser AfficheBD, vous pouvez aussi fermer la BD à la fin de Main4, la rouvrir et ensuite relancer la recherche de la facture.
  5. Dans une nouvelle classe Main5, récupérez la facture, sans récupérer les produits concernés. Est-ce possible ? Ajoutez ensuite l'affichage de la facture avec la méthode afficher de la classe Facture. Si les articles n'ont pas été récupérés, vous devriez avoir une NullPointerException. Expliquez pourquoi et vérifiez votre explication.
  6. Dans une nouvelle classe Main6, supprimez de la base de données tous les produits concernés par la facture (sans utiliser leur référence en les lisant sur votre écran), sans supprimer la facture. Est-ce possible ? Est-ce que ça serait possible avec un SGBD relationnel ?
  7. A la suite du code de la question précédente fermez la BD (normalement c'est déjà fait), rouvrez-là. Que se passe-t-il si vous récupérez la facture en mémoire centrale?

Correction

Main3.java
Question 2
AfficheBD.java
Main4.java
Main5.java
Main6.java


Gestion des identités - Interrogation plus complexe de la base

Une autre facture :

Numéro : 08/5700 Date : 5/10/2008 Client : Pierre François
Article Quantité PU Prix
S001 - Stylo noir Marker
7
40
280
R54 - Ramette vert 80g/m²
20
15
300
Prix total :
580 €
  1. Rajoutez les articles que vous avez supprimés à la fin de l'exercice précédent.
  2. Ecrivez une classe Main7 dont la méthode main crée la facture ci-dessus. Créez toutes les instances nécessaires. Faites afficher la facture. Rangez la facture dans la BD.
  3. Utilisez AfficheBD pour vérifiez que l'article de référence S001 n'est pas dupliqué dans la BD.
  4. Dans une classe Main8, faites une recherche dans la base de données pour ramener toutes les factures qui ont l'article S001 dans leurs lignes. Pouvez-vous y arriver avec une recherche par l'exemple ? avec une requête native ? Est-ce que la requête native a été optimisée ? Vous pouvez vous aider des informations contenues dans cette page ou cette autre page (il est possible d'utiliser un écouteur d'exécution de recherche, de la classe Db4oQueryExecutionListener) pour savoir si une requête native a été optimisée.

Correction

Main7.java
Main8.java

DAO

Implémentez les classes DAO pour les articles (seulement les stylos et les ramettes comme pour le TP sur les DAO), adaptées à db4o. Choisissez la variante des DAOs dont les méthodes prennent des objets en paramètre, par exemple create(Stylo stylo).

Correction

DaoStylo.java
TestDaoStylo.java


Si vous avez déjà fini...

Écrivez les DAOs pour les lots et pour les factures.


Retour