1. Introduction
2.Instance JDO
La classe dune instance persistante, appele instance JDO, doit implmenter linterface javax.jdo.spi.PersistenceCapable .Une instance dune telle classe peut ne pas tre pe rsistante. Elle le sera seulement si elle est passe en paramtre de la mthode makePersistent() de la classe PersistenceManager ou si elle est rfrence par une instance persistante.
Si linstance que lon veut supprimer est rfrence par une autre instance persistante, il ne faut pas oublier denlever cette rfrence, sinon linstance redeviendra persistante par rfrence. En particulier, pour les relations 1 -N ou M-N, il ne faut pas oublier de retirer linsta nce que lon veut supprimer des collections qui correspondent ces relations..
3.1.Packages de JDO
LAPI est compose de 2 packages : javax.jdo : les classes et interfaces utilises par les dveloppeurs, javax.jdo.spi : les classes et interfaces utilises par JDO pour son fonctionnement interne
4.Mta-donnes
4.1.Les mta-donnes
Utilises par lapplication et les outils JDO pendant lenrichissement des classes et lexcution de lapplication, elles donnent le point de vue des classes Java un point de vue objet sur les donnes persistantes ; par exemple, quels champs de la classe seront persistants (enregistrs dans la base) les relations entre les classes persistantes : 1 -1, 1-N, M-N. Il ny a cependant aucune information sur la base qui va contenir les donnes ; cest limplmentation
de JDO qui va utiliser dautres informations internes, ou ventuellement donnes dans dautres fichiers, pour faire le mapping (liaison) entre ce point de vue objet et le point de vue de la base de donnes (par exemple relationnel ). Des extensions permettent cependant de donner limplmentation JDO des indications sur la faon deffectuer ce mapping. Ces mta-donnes sont ranges dans un (ou plusieurs) fichier XML.
4.4.Types persistants
Tous les champs ne peuvent pas tre dclars persistants ; ils doivent tre dun type accept par limplmentation JDO, la spcification JDO imposant que certains types soient accepts. Si un type nest pas persistant pour limplmentation utilise, on peut encore souvent sen sortir en utilisant des observateurs dvnements JDO.
java.util.Date java.util.HashSet (optionnellement les autres classes collections) dune classe capable de persistance de la classe Object, mais limplmentation JDO peut restreindre les affectations ce champ en lanant une ClassCastException des interfaces collections Collection et Set (Map et List sont optionnels) de nimporte quelle interface, mais limplmentation JDO peut restreindre les affectations ce champ en lanant une ClassCastException
4.8.Nom de classe
Si la classe appartient aux paquetages java.lang, java.util ou java.math, ou au package indiqu par le tag package dans lequel elle est indique, on peut ne donner que son n om terminal . Sinon, il faut donner le nom complet (prfix par le nom du paquetage). Les noms des classes internes sont crits sous la forme ClasseEnglobante$ClasseInterne
5.2.Interface PersistenceCapable
Elle est compose de quelques constantes et de mthodes qui permettent : de grer la persistance des instances, dinterroger une instance sur son tat au moment de lexcution. Toutes les mthodes ont des noms qui commencent par jdo ; ces mthodes sont utilises par JDO pour son fonctionnement interne.
5.4.Processus de dveloppement
Le dveloppement standard dune application JDO sorganise comme suit : crire les classes sans se proccuper de la persistance, Reprer les classes correspondant aux objets persistants (classes capables de persistance ), crire les mta-donnes qui dcrivent le schma de la base de donnes et les informations pour rendre les objets persistants, Enrichir les classes persistantes avec les outils JDO, Utiliser les objets persistants pour crire et tester lapplication. Lintrt de JDO est que lon peut souvent compiler toutes les classes de lapplication avant mme davoir enrichi celles qui sont capables de persistance. En effet, les appels aux mthodes de
linterface PersistenceCapable sont effectus par limplmentation de JD O ; elles ne sont donc pas crites dans les classes de lapplication et ne provoquent donc pas derreurs de compilation.
5.5.Outils de dveloppement
Les implmentations de JDO fournissent des outils pour : enrichir les classes persistantes (indispensable) , gnrer les ordres SQL pour crer le schma de la base de donnes. partir des mta donnes (optionnel), gnrer les mta-donnes partir dune base de donnes existante (optionnel).
6.2.Le code
On doit importer le paquetage javax.jdo qui contient les classes distribues par Sun. Le plus souvent JDO napparat que par lintermdiaire du gestionnaire de persistance
6.2.1.Classe de base
fr.labosun.jdoProject; Chat { String nom; String couleur; String age; Chat(String nom, String couleur, String age){ .nom = nom; .couleur = couleur; .age = age; } String getNom() { nom; } setNom(String nom) { .nom = nom; }
6.2.2.Enrichissement de la classe
On utilise loutil pour enrichir la classe Chat ; dans limplmentation de JDO LiDO, cest la classe Java Enhance qui fait office de cet outil. On doit lui passer : une classe Java enrichir des mta-donnes qui dcrivent les classes persistantes
6.2.3.Mta-donnes
<jdo> <package name="fr.labosun.jdoProject"> <class name="Chat"> <field name="nom"/> <field name="couleur"/> <field name="age"/> </class> </package> </jdo>
Les implmentations de JDO offrent dautres outils que lenrichisseur de classes. Un des outils permet de gnrer le code pour construire la base de donnes qui va contenir les objets persistants. Pour LiDO la classe DefineSchema a cette fonction. Le paramtre -sql permet denregistrer dans un fichier les ordres SQL qui vont crer la base, sans les faire excute r (utile pour information et en cas de problme)
2.
On doit indiquer le driver JDBC, lURL JDBC de la base et le fichier qui contient les mta donnes : Le classpath doit contenir les classes enrichies de lapplication, les fichiers jar de limplmentation de JDO et le driver JDBC java com.libelis.lido.ds.jdbc.DefineSchema :
driver : com.mysql.jdbc.Driver database : jdbc:mysql://localhost/chats metadata : metadata.jdo set LIDO_HOME=C:\Program Files\LiDo java -cp "%LIDO_HOME%\lib\lido-rt.jar;..."
6.2.11.Excuter Test1
Le fichier metadata.jdo est utilis pendant lexcution des classes persis tantes. Avec LiDO, on peut indiquer son emplacement avec la proprit Java jdo.metadata : java Djdo.metadata=<filepath> -classpath ... fr.labosun.jdoProject.Test1
7.1.1.Pr requis
Si on a une hirarchie dhritage, une classe peut tre persistante ou non, indpendamment des autres classes de larborescence (classes filles ou mres). Pour cela, il faut que : Toutes les classes persistantes de larborescence doivent avoir la mme cl pr imaire (gre par la base ou par lapplication), donne dans la classe la plus haute hirarchiquement, Tous les champs persistants le restent dans les classes filles persistantes, Toutes les classes doivent avoir un constructeur sans paramtre.
4.
5.
Classe Personne
fr.labosun.jdoProject; Personne { String nom, prenom, adresse; Personne (String nom, String prenom, String adresse) { .nom = nom; .prenom = prenom; .adresse = adresse;
6.
Classe Salarie
fr.labosun.jdoProject; Personne { double prime; double salaire; Salarie(double prime, double salaire, String nom, String prenom, String a dresse) { (nom, prenom, adresse); .prime = prime; .salaire = salaire; } String getPrime() { prime; } setPrime(double d) { prime = d; } //... (get/set) }
Et dans l'autre classe une variable du type de l'autre classe : <class name="Salarie"> <field name="societe"/> ...</class> On peut ne pas faire cette inclusion si on veut interdire la navigation vers la classe matresse .
<class name="Zoo"> <field name="singes"> <collection element -type="fr.labosun.jdoProject.Singe"/> </field> <field name="nom"/> <field name="directeur"/> </class>
13.
<class name="Singe"> <field name="nom"/> <field name="age"/> <field name="couleur"/> <field name="zoo"/> </class>
14.
15.
Classe Zoo
fr.labosun.jdoProject;
java.util.Collection; Zoo { String nom; Collection singes; Directeur directeur; Zoo(String nom) { singes = ArrayList(); .nom = nom; } addSinge(Singe singe) { singes.add(singe); } removeSinges(Singe singe) { singes.remove(singe); } Collection getSinges() { singes; } setSinges(Collection singes) { .singes = singes; } //... (get/set) }
16.
fr.labosun.jdoProject;
Classe Singe
Singe { String nom, age, couleur; Zoo zoo; Singe(String nom, String age, String couleur) { .nom = nom; .age = age; .couleur = couleur; } String getNom() { nom; } setNom(String nom) { .nom = nom; } //... (get/set) }
17.
fr.labosun.jdoProject; Directeur{ String nom; salaire; Zoo zoo;
Classe Directeur
salaire, Zoo zoo) { .nom = nom; .salaire = salaire; .zoo = zoo; } String getNom() { nom; } setNom(String nom) { nom = nom; } //... (get/set) }
8.1.Introduction
2 parties : l'API pour faire des requtes : des mthodes de la classe PersistenceManager, le langage d'interrogation lui-mme. JDOQL permet de retrouver, modifie r et supprimer des donnes gres par un gestionnaire de persistance.
8.2.Interface Extent
JDOQL utilise intensivement l'interface javax.jdo.Extent. Une instance d'une classe qui implmente Extent est une sorte de collection d'instances JDO qui reprsente des donnes de la base ; les donnes de la base reprsentes par les instances contenues dans l'Extent ne sont vraiment rcupres qu' la demande, par l'itrateur qui le parcourt.
8.2.1.Obtenir un Extent
On utilise la mthode getExtent de la classe PersistenceManager laquelle on doit passer en paramtres pour rcuprer une instance d Extent : la classe des instances persistantes contenues dans l' Extent (preciser le package complet si besoin), dire si on veut inclure les instances des sous -classes de cette classe.
8.3.Recherche d'information
La recherche dinformation se fait avec la classe javax.jdo.Query qui permet de rcuprer des instances persistantes enregistres dans la base. Dans la version actuelle de JDO, une recherche ne donne pas des valeurs de champs mais des instances entires.
8.3.1.Obtenir un Query
Pour obtenir une instance de Query, on utilise la mthode newQuery de la classe PersistenceManager (qui est la fabrique de Query). Il existe un grand nombre de mthodes Query surcharges, mais un Query a besoin de : la classe des instances que l'on veut obtenir, ou d'une collection (ou d'un extent) dans laquelle chercher (ils sont appels les candidats ), et optionnellement d'un filtre pour slectionner les instances (cf. 8.4).
Query query = pm.newQuery(extent, "zoo.nom == z"); Query query = pm.newQuery(Singe., "zoo.nom == z");
8.3.2.Classe Query
La cration dun Query nest pas fixe ds lors quon la instanci ; on peut le paramtrer grce aux mthodes suivantes : On peut modifier un Query avec les mthodes setClass(), setFilter(), setCandidate() On peut fixer un ordre par setOrdering() (syntaxe proche de SQL : salaire descending, nom) On peut compiler le Query (mthode compile()), ce qui permet de vrifier les l ments du Query et de donner une chance limplantation JDO doptimiser le Query pour plusieurs utilisations futures.
8.3.6.Importation de classes
On peut aussi avoir besoin d'importer des classes de dclaration des paramtres ou des variables (dcrites plus loin) pour enlever une ambigut. La syntaxe est celle de Java ( ; est le sparateur) : query.declareImports(" import java.util.Date; import fr.labosun.AutreCls");
8.3.9.Exemple :
Extent extSinges = pm.getExtent(Singe. class, ); Query q = pm.newQuery(extSinges, "zoo.nom == z"); q.declareParameters("String z"); Collection singes = (Collection) q.execute("Zoo de Vincenne");
8.2.Interface Extent
JDOQL utilise intensivement l'interface javax.jdo.Extent. Une instance d'une classe qui implmente Extent est une sorte de collection d'instances JDO qui reprsente des donnes de la base ; les donnes de la base reprsentes par les instances contenues dans l'Extent ne sont vraiment rcupres qu' la demande, par l'itrateur qui le parcourt.
8.2.1.Obtenir un Extent
On utilise la mthode getExtent de la classe PersistenceManager laquelle on doit passer en paramtres pour rcuprer une instance d Extent : la classe des instances persistantes contenues dans l' Extent (preciser le package complet si besoin), dire si on veut inclure les instances des sous -classes de cette classe.
8.3.Recherche d'information
La recherche dinformation se fait avec la classe javax.jdo.Query qui permet de rcuprer des instances persistantes enregistres dans la base. Dans la version actuelle de JDO, une recherche ne donne pas des valeurs de champs m ais des instances entires.
8.3.1.Obtenir un Query
Pour obtenir une instance de Query, on utilise la mthode newQuery de la classe PersistenceManager (qui est la fabrique de Query). Il existe un grand nombre de mthodes Query surcharges, mais un Query a besoin de : la classe des instances que l'on veut obtenir, ou d'une collection (ou d'un extent) dans laquelle chercher (ils sont appels les candidats ), et optionnellement d'un filtre pour slectionner les instances (cf. 8.4).
Query query = pm.newQu ery(extent, "zoo.nom == z"); Query query = pm.newQuery(Singe., "zoo.nom == z");
8.3.2.Classe Query
La cration dun Query nest pas fixe ds lors quon la instanci ; on peut le paramtrer grce aux mthodes suivantes : On peut modifier un Query avec les mthodes setClass(), setFilter(), setCandidate() On peut fixer un ordre par setOrdering() (syntaxe proche de SQL : salaire descending, nom) On peut compiler le Query (mthode compile()), ce qui permet de vrifier les lments du Query et de donner une chance limplantation JDO doptimiser le Query pour plusieurs utilisations futures.
8.3.6.Importation de classes
On peut aussi avoir besoin d'importer des classes de dclaration des paramtres ou des variables (dcrites plus loin) pour enlever une ambigut. La syntaxe est celle de Java ( ; est le sparateur) : query.declareImports(" import java.util.Date; import fr.labosun.AutreCls");
8.3.9.Exemple :
Extent extSinges = pm.getExtent(Singe. class, ); Query q = pm.newQuery(extSinges, "zoo.nom == z"); q.declareParameters("String z"); Collection singes = (Collection) q.execute("Zoo de Vincenne");
8.4.Filtres
Lors de la cration du Query, on peut filtr ds celle-ci les rsultats qui seront retourns grce a des filtres. La condition de slection des filtres peut tre complexe et peut comporter des && , || , ! comme en Java. Elle peut aussi utiliser les noms des champs de la classe des instances recherches, ainsi que des mthodes. Les seules mthodes autorises dans les filtres sont : Des mthodes sur les String, Des mthodes sur les Collection.
une condition qui devra tre remplie par au moins un lment de celle -ci pour que la condition soit vraie. query.declareVariables("Singe singe"); String filter = "singes.contains(singe) & singe.age > 5" Ca peut s'interprter comme la variable singe est contenue dans la Collection singes et elle vrifie singe.age > 5 . isEmpty() (renvoie true si la collection est vide) String filter = "singes.isEmpty()"
8.4.3.Remarque importante
Les noms utiliss dans les filtres sont les noms des classes Java et des variables persistantes. Il ne faut pas utiliser les noms des tables (ou autres) dans l esquelles les donnes vont tre enregistres. Le principe de JDO est que lon travaille sur des objets sans pour autant connatre les tables relationnelles ou autres supports de donnes.
8.4.4.Exemple
Extent extent = pm.getExtent(Zoo.); String filter = "directeur.salaire > min && directeur.nom.startsWith( \"letter\")"; Query qry = pm.newQuery(extent, filter); qry.declareParameters("String min, String letter"); Collection zoos = (Collection) qry.execute("1200","A"); Iterator it = zoos.iterator (); (it.hasNext()) { Zoo zoo = (Zoo) it.next(); System.out.println("Zoo : "+zoo.getNom()); } Cet exemple permet de rcuprer et dafficher toutes les instances persistantes du Zoo dont le directeur a un salaire de plus de 1200 et dont le nom commen ce par A.
9.1.Dfinition
Le modle objet des donnes manipules par JDO (les instances JDO) contient 2 types dinstances : FCO (First Class Object) : instance JDO qui ont une identit JDO, SCO (Second Class Object) : elle na pas didentit JDO par elle -mme ; elle correspond des donnes qui sont enregistres comme une partie des donnes dun FCO.
9.2.FCO et SCO
Les types qui correspondent aux interfaces qui ne sont pas des collections doivent tre implments avec des FCO. Tous les autres types peuvent tre implments avec des FCO et des SCO La spcification indique que les applications JDO ne doivent pas dpendre du fait que ces types sont implments par des FCO et des SCO Mais, il nest pas vident de savoir comment faire quand on lit cette spcification