Castor-JDO

Besoin

Fournir une solution de persistance pour les objets Java.

Conception

Contrairement à ce que semble indiquer son nom, Castor-JDO est un framework de persistance qui ne respecte pas la norme JDO. Il utilise la réflexivité de Java pour accéder (en lecture ou écriture) à l'état des objets métiers persistants. Ceux-ci doivent donc fournir des accesseurs de type JavaBeans standard permettant à Castor-JDO d'accéder à leur état.

Castor permet de configurer :

Implémentation

L'API de Castor est relativement simple (1 classe, 7 interfaces) dans le package org.exolab.castor.

Les classes métier doivent implémenter des accesseurs de type JavaBeans standard (<strong>get</strong>Xxx()/<strong>set</strong>Xxx()) permettant à Castor-JDO d'accéder à leur état.

La récupération d'objet persistant peut se faire par <strong>Database</strong>::<strong>load</strong> (telleClasse, clé) ou via une requête Castor OQL.

La configuration se fait via 2 fichiers XML pour :

Exemples

Un exemple de code Castor-JDO est :

<strong>Database</strong> myDatabase = jdo.<strong>getDatabase</strong>();<br> myDatabase.<strong>begin</strong>();<br> Adresse adresse = new Adresse();<br> adresse.setLibelle (<span class="codeString">“34 avenue des fleurs en pot 06000 NICE“</span>);<br> adresse.setDepartement (Departement);<br>myDatabase.<strong>load</strong> (Departement.class, 6);<br> myDatabase.<strong>create </strong>(adresse);<br> myDatabase.<strong>commit</strong>();<br> myDatabase.<strong>close</strong>();

Un exemple de requête Castor OQL est :

<strong>Query</strong> myQuery = <q><code>myDatabase</code></q>.<strong>getOQLQuery </strong>(<span class="codeString">"SELECT a FROM Adresse WHERE a.id = $1</span>");<br> myQuery.<strong>bind</strong> (new Long (idAdresse));<br> <strong>QueryResults</strong> myQueryResults = myQuery.<strong>execute</strong>();<br> Adresse adresse = (Adresse) myQueryResults.<strong>next</strong>();

Un exemple de descripteur Castor-JDO est :

<<strong>class access</strong>=<strong><span class="codeString">"</span></strong><span class="codeString"><strong>shared</strong></span><span class="codeString">"</span> <strong>name</strong>=<span class="codeString">"Adresse"</span> <strong>identity</strong>=<span class="codeString">"id"</span> <strong>key-generator</strong>=<span class="codeString">"<strong>IDENTITY</strong>"</span>><br> <br> <<strong>description</strong>>Adresse</<strong>description</strong>><br> <br> <<strong>map-to table</strong>=<span class="codeString">"ADRESSE"</span> <strong>xml</strong>=<span class="codeString">"adresse"</span>/><br> <br> <<strong>field name</strong>=<span class="codeString">"id"</span> <strong>type</strong>=<span class="codeString">"long"</span> <strong>dirty</strong>=<span class="codeString">"<strong>ignore</strong>"</span> <strong>required</strong>=<span class="codeString">"<strong>true</strong>"</span>><br> <<strong>sql name</strong>=<span class="codeString">"ID_ADRESSE"</span> <strong>type</strong>=<span class="codeString">"<strong>numeric</strong>"</span>/><br> <<strong>xml node</strong>=<span class="codeString">"attribute"</span>/><br> </<strong>field</strong>><br> <br> <<strong>field name</strong>=<span class="codeString">"adresse"</span> <strong>type</strong>=<span class="codeString">"java.lang.String"</span> <strong>dirty</strong>=<span class="codeString">"<strong>ignore</strong>"</span> <strong>required</strong>=<span class="codeString">"<strong>true</strong>"</span> ><br> <<strong>sql name</strong>=<span class="codeString">"ADRESSE"</span> <strong>type</strong>=<span class="codeString">"char"</span>/><br> <<strong>xml node</strong>=<span class="codeString">"element"</span>/> <br> </<strong>field</strong>> <br> <br> <span class="codeComment"><!-- References – Clés étrangères --></span> <br> <<strong>field name</strong>=<span class="codeString">"departement"</span> <strong>type</strong>=<span class="codeString">"Departement"</span> <strong>dirty</strong>=<span class="codeString">"<strong>ignore</strong>"</span> <strong>required</strong>=<span class="codeString">"<strong>false</strong>"</span>><br> <<strong>sql name</strong>=<span class="codeString">"ID_DEPARTEMENT_ADRESSE"</span>/><br> <<strong>xml node</strong>=<span class="codeString">"attribute"</span> <strong>reference</strong>=<span class="codeString">"<strong>true</strong>"</span>/><br> </<strong>field</strong>><br> <br> <span class="codeComment"><!-- many-references --></span><br> <<strong>field</strong> <strong>name</strong>=<span class="codeString">"dsvsAdresse"</span> <strong>type</strong>=<span class="codeString">"Personne"</span> <strong>collection</strong>=<span class="codeString">"<strong>vector</strong>"</span>><br> <<strong>sql</strong> <strong>many-key</strong>=<span class="codeString">"ID_ADRESSE_PERSONNE"</span>/><br> <<strong>xml</strong> <strong>node</strong>=<span class="codeString">"element"</span>/> <br> </<strong>field</strong>> <br> </<strong>class</strong>>

Notes

Persistance Solution Castor-JDO
Version 0.9
Transactions Explicites JTA
Implicites Non
Pessimistes Exclusive
Optimistes Shared
Distribuées JTS
Mémoire
Cycle de vie Callbacks
Requêtes Langage objet Castor OQL
Projections, vues
Fonctions aggrégats
SQL possible Database:: getOQLQuery ("CALL SQL ...")
Accès au code Non
Performance Cache Oui
Détection des modifications
Transparence Accès aux informations Réflexivité Java
Relations (1-n, n-m) Oui
Héritage Oui
Collections Java
Persistance de proche en proche
Non intrusion dans le code des objets métier Méthodes d'accès aux données obligatoires
Accès au graphe d'objets dépendants
Accès au modèle métier Oui
Mapping Multi-tables Oui
Top-down
Bottom-up
Granularité fine
Stockage Paradigme libre SGBDR, XML, LDAP
Support d'une base existante Oui
Portabilité API standard org.exolab.castor
J2ME
J2SE Oui
J2EE
Implémentations
Licence Style BSD

Limitations