slam4:orm:kobject

KObject

Site de référence : www.kobject.net
KObject est un produit Open source sous licence GNU LGPL, disponible sur la forge logicielle sourceforge.net.

Principales fonctionnalités :

  • Mapping relationnel/Objet
  • Mise en place de MVC2 pour J2ee

Vous disposez de :

  • Eclipse Juno J2EE
  • Kobject-library1.0.0.23f-beta1
  • Mysql Server
  • Driver JDBC pour Mysql

Nous allons travailler à partir d'un cas simple, et assez couramment utilisé :

  • Un SI composé de produits, classés en catégories (1 CIF).
  • Des commandes de produits effectuées, dont le détail est stocké dans des lignes (1 CIM).

Schéma de la base de données ORM

Mise en place la configuration logicielle.

  • Créer un nouveau Dynamic Web Project dans Eclipse
  • Intégrer le jar de Kobject et le driver JDBC pour mysql dans le dossier WebContent/WEB-INF/lib
  • Copier le fichier de configuration de Kobject (config.ko) à la racine du projet.
  • copier le fichier de configuration d'ehCache ehCache.xml dans le dossier src

Attention, ne pas utiliser le plugin KObject pour ce TD, et ne pas ajouter KObject au projet.
Ne pas générer les classes de façon assistée, avec le plugin.

  • Créer la base de données ormK sur votre serveur Mysql en exécutant le script de création (la base est créée dans le script).

Afficher le concepteur pour visualiser les tables, et les relations : Pour chaque table, notez les contraintes d'intégrité :

  1. d'entité (clé primaire)
  2. référentielle (relations)

Exemple :

Produit :

  • id (primary key)
  • idCategorie (foreign key references categorie.id)

Placer le fichier de configuration de KObject à la racine du projet, et ouvrez le :

Vérifiez les paramètres de connexion à Mysql.

Propriété Valeur Signification
package metier Package java dans lequel les classes métier seront définies
debug SQL Permet d'afficher les instructions SQL exécutées dans la console Eclipse
config.ko
base=ormK
classes=
controlClass=
cssFile=WebContent/css/css.properties
dbOptions=
dbType=mysql
debug=SQL
erFile=WebContent/conf/validation/er.properties
footerURL=WEB-INF/footer.jsp
headerURL=WEB-INF/header.jsp
host=127.0.0.1
koDateFormat=dd/MM/yyyy
mappingFile=WebContent/conf/mox.xml
messagesFile=WebContent/conf/validation/messages.properties
nullValue= 
package=metier
password=
port=3306
sqlDateFormat=yyyy-MM-dd
useSetters=false
user=root
validationFile=WebContent/conf/kox.xml
webApp=false
useCache=false
cacheType=1

Modèle relationnel :

Modèle Objet (diagramme de classes) correspondant :

Nous allons modifier le modèle Objet pour le rendre compatible avec KObject et permettre le mapping, en ajoutant les membres qui serviront de clés étrangères (habituellement inutiles dans le monde Objet) :

Modèle objet KObject

La persistance des données est mise en place par Héritage et introspection. Les classes métier doivent hériter de la classe KObject.

Ci-dessous le début de l'implémentation des classes :

 Classe Categorie

 Classe Produit

Les principes de construction des classes métiers à mapper avec KObject sont les suivants :

  • A chaque champ de la base correspond un membre de données de la classe
  • les types de données java et sql doivent être compatibles (consulter la documentation KObject pour voir la correspondance entre les types)
  • La classe doit être un java Bean pour permettre à KObject de travailler :
    • elle doit disposer d'un constructeur sans paramètre initialisant le membre keyFields définissant les champs présents dans la clé primaire
    • Chacun de ses membres doit disposer d'accesseurs

  • Implémenter les classes Categorie et Produit dans le package metier
  • Utiliser la complétion pour faire les imports
  • Générer les accesseurs, le constructeur sans paramètre
  • Ajouter un constructeur initialisant les membres de données et appelant le constructeur précédent
  • Ajouter un toString affichant les champs proprement concaténés

A partir de l'observation de cette première implémentation et en utilisant à bon escient la documentation, répondez aux questions suivantes :
  1. Comment est déclarée la table assurant la persistance d’un objet ?
  2. Comment est déclaré le mapping entre un membre de la classe et un champ de la table relationnelle ?
  3. Comment est déclarée la clé primaire de la table ?
  4. Réaliser un tableau montrant la correspondance de type (entier, chaine, etc.) entre les propriétés d’une classe et les champs d’une table.
  5. Montrez à l’aide d’un schéma (par ex. deux classes liées au dessus de deux tables liées) comment se paramètre le lien bidirectionnel entre deux classes (en spécifiant les éléments à fournir dans le constructeur)

Programme de test

  • Implémenter le programme suivant dans un package nommé console, rendez le exécutable.
  • Exécutez le code puis observez la base de données.

Programme de test

Analysez le code du programme et répondez aux questions en vous aidant au besoin de la documentation :
  1. À quoi correspond la méthode kstart() ?
  2. Comment ont été traduits les liens objet entre le membre categorie et produits entre ces classes dans les tables de la base ?
  3. Quelles requêtes SQL ont été créées par KObject pour réaliser la persistance ?
  4. Que se passe t-il si l'insertion de la catégorie échoue ?

Observation du chargement d'un objet, par l'intermédiaire de sa clé primaire.

Programme de chargement d'un produit

  • Implémenter le programme suivant dans le package nommé console, rendez le exécutable.
  • Exécutez le code et regardez le résultat.
  • Mettez le point d'arrêt indiqué et inspectez l'objet aProduit, et son membre catégorie .

Chargement d'un Produit

Programme de chargement d'une catégorie

  • Implémenter le programme suivant dans le package nommé console, rendez le exécutable.
  • Exécutez le code et regardez le résultat.
  • Mettez le point d'arrêt indiqué et inspectez l'objet aCategorie, et son membre produits.
  • Exécutez en pas à pas (step over) et inspectez toujours l'objet aCategorie, et son membre produits.
 Programme de chargement d'une catégorie

A partir de ces 2 programmes et de leur exécution :
  1. Précisez ce que charge exactement KObject lors du chargement d'un Objet
  2. Précisez comment sont chargées les instances liées à un objet chargé pour les liens belongsTo et hasMany
  3. En quoi consiste le chargement paresseux de KObject ?

Interrogation de données avec KObject :

Créer le programme suivant

 Projection des catégories

Remplacez la boucle d'affichage des produits par :

	System.out.println(categories.showWithMask("{libelle}:\n{produits}\n"));

A partir de l'exécution du programme modifié :
  1. Interprétez et expliquez le résultat obtenu

Créer le programme suivant

 Sélection de produits dont le prix est supérieur à 10

A partir du programme :
  1. Combien de requêtes SQL sont exécutées par KObject ?
  2. Comment l'interprétez vous ?

Remplacer le lien belongsTo sur la classe Produit par :

belongsTo(KCategorie.class).setLazy(true);

  1. Combien de requêtes SQL sont maintenant exécutées par KObject ?
  2. Comment l'interprétez vous ?

Exécutez à nouveau le programme.

Créer le programme suivant

A partir du programme :
  1. Interprétez les requêtes SQL exécutées par KObject

Créer le programme suivant

A partir du code et de son exécution :
  1. Expliquer ce que fait le programme

Implémenter les classes métier Commande et Ligne, en utilisant le début de leur implémentation donné ci dessous, et le diagramme de classe :
  • Ne pas oublier les règles citées précédemment (bean + héritage de KObject + définition du membre keyFields)
  • Ajouter un constructeur avec paramètres permettant d'instancier correctement une ligne et une commande

 Classe Commande

 Classe Ligne

  1. Justifiez l'appel des méthodes permettant de mettre en oeuvre la contrainte d'intégrité multiple

Implémenter le programme suivant.
Exécutez le.

 Programme de création de commande

  1. Analysez puis commentez chaque ligne (dans le code) de ce programme
  2. Vérifier que l'exécution a effectué les ajouts dans la base de données

Test Web

  • Dans un package technics, Écrire une classe Gateway disposant de méthodes statiques permettant d'obtenir les résultats suivants :
    1. La liste des catégories ;
    2. la liste des produits d’une catégorie donnée ;
    3. enregistrant une ligne ;
    4. enregistrant une commande.
  • Créer une classe Display disposant d'une méthode statique
    1. Retournant une liste au format HTML à partir d'une ArrayList passée en paramètre
  • Construire les pages JSP répondant au service suivant :
    1. l’utilisateur lance l’application dans son navigateur ;
    2. il voit une liste déroulante de catégories ;
    3. il sélectionne une catégorie dans la liste et voit une liste déroulante des produits de cette catégorie ;
    4. il sélectionne un produit et saisit une quantité voulue ;
    5. un bouton lui permet de continuer le remplissage de son panier (retour à 2)
    6. un bouton lui permet de valider son panier : la commande est alors enregistrée.
Ajouter toutes les classes (servlet) et méthodes nécessaires pour éviter d'avoir à effectuer un quelconque traitement dans les JSP.
.

  • slam4/orm/kobject.txt
  • Dernière modification : il y a 5 ans
  • de 127.0.0.1