Fournir une solution de persistance pour les objets Java.
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 :
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 :
<strong>class</strong>
contenant :
<strong>map-to</strong>
qui l'associe à une table de la base de
données relationnelle<strong>field</strong>
qui définissent les mappings
table/champ-classe/attribut.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>>
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 |