Présentation La persistance avec JDO Kerlyne FOSTINE Figaro LUC INF7115-Base de données 1 Plan 1. Introduction à JDO 2. Architecture 3. Gestion des transactions 4. Les interfaces et les classes JDO 5. Les requêtes JDO 6. Exemple d’implémentation 7. Références INF7115-Base de données 2 1. Introduction à JDO JDO : Java Data Object Persistance Mapping transparente des instances Java Persistance universelle Mise à jour implicite des données Modélisation d’objets sans contrainte Réduction du temps de développement INF7115-Base de données 3 Méthodes de persistance Sérialisation (les systèmes de fichiers) JDBC (les bases de données) Les beans d’entité (BMP, CMP) JDO INF7115-Base de données 4 JDO face aux autres méthodes de persistance INF7115-Base de données 5 2. Architecture Architecture générale INF7115-Base de données 6 JDO dans un environnement non géré Usage deux tiers Javax.jdo.PersistenceManager Javax.spi.PersistenceCapable INF7115-Base de données 7 JDO dans un environnement géré par un serveur d’application J2EE Entity Session INF7115-Base de données JDO 8 Les implémentation et les vendeurs JDO Versant (Versant Open Access JDO) Xcalia (LIDO) SolarMetric (KODO JDO Entreprise ou Standard Édition) Sun (JSR-12) INF7115-Base de données 9 Modèles d’objets persistants INF7115-Base de données 10 Instances et cycle de vie Transient : Instanciation, seulement en mémoire centrale New : Déclaré persistant pour la première fois Persistent : Opposé de Transient Hollow : Pas de lecture dans la source de données Dirty : Modification des champs au cours de la transaction Deleted : Effacé au cours de la transaction Transactional : Peut participer à une transaction Clean : Pas de modification après la lecture dans une source de données INF7115-Base de données 11 Cycle de vie des instances (Suite) INF7115-Base de données 12 Cycle de développement des JDO Descripteur de persistance JDO Enhancer INF7115-Base de données 13 3. Gestion des transactions Caractéristiques des transactions (ACID) Stratégies de transactions Stratégie pessimiste de transaction Courte durée de vie Blocage pendant toute la durée de la transaction Stratégie optimiste de transaction Longue durée de vie Réduction des blocages Augmentation de la concurrence INF7115-Base de données 14 4. Les interfaces et les classes JDO Packages javax.jdo javax.jdo.spi Classe JDOHelper Interface PersistenceManager PersistenceCapable PersistenceManagerFactory Extent Transaction INF7115-Base de données 15 5. Les requêtes JDO SQL : les bases de données relationnelles OQL : les bases de données objet EJBQL : les beans d’entité JDOQL : nouveau langage spécifique à JDO INF7115-Base de données 16 Interface de requête JDOQL INF7115-Base de données 17 Exemple de requête JDOQL import java.util.Collection; import java.util.Iterator; import javax.jdo.*; public class SimpleQuery { public static void main() { JDOBootstrap bootstrap = new JDOBootstrap(); PersistenceManagerFactory pmf = bootstrap.getPersistenceManagerFactory(); PersistenceManager pm = pmf.getPersistenceManager(); Transaction t = pm.currentTransaction(); t.begin(); Extent partnerExt = pm.getExtent(BusinessPartner.class, true); Query q = pm.newQuery(partnerExt); Collection c = (Collection) q.execute(); Iterator i = c.iterator(); System.out.println("Listing all BusinessPartner instances:"); while(i.hasNext()) { Object o = i.next(); System.out.println(o); } System.out.println("Done."); q.close(c); t.commit(); } } INF7115-Base de données 18 6. Exemple d’implémentation (Médica Inc) Médica INC, une entreprise qui permet de commander des produits en ligne. Commande Client nom prenom telephone adresse email fax utilisateur motDePasse date montant Produit description prixUnitaire quantite commande 0..n Commande() 1 Produit() reference comprend 1..n 1..n LigneCommande quantite Client() LigneCommande() 1 Medicament contreIndication indication dateExpiration posologie presentation typeMedicament voieAdministration Medicament() INF7115-Base de données 19 Les classes Java package com.gestionCommande; import java.util.*; public class Client{ private String nom; private String prenom; private String telephone; private String adresse; private String email; private String fax; private String utilisateur private String motDePasse; private Set commandes; private Client(){ } public Client(String nom, String prenom, String telephone, String adresse, String email, String fax, String utilisateur, String motDePasse){ this.nom=nom; this.prenom=prenom; this.telephone=telephone; this.adresse=adresse; commandes=new HashSet(); } public String getNom(){ return nom; } public void setNom(String nom){ this.nom=nom; } …. INF7115-Base de données 20 Descripteur de persistence <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE jdo PUBLIC "-//Sun Microsystems, Inc.//DTD Java Data Objects Metadata 1.0//EN" "http://java.sun.com/dtd/jdo_1_0.dtd"> <jdo> <package name="com.gestionCommande"> <class name="Client" > <field name="Commandes"> <collection element-type="Commande"/> </field> </class> <class name="Produit" > </class> <class name="Medicament" > </class> <class name="LigneCommande" > <field name="produits"> <collection element-type="Produit"/> </field> </class> <class name="Commande" > <field name="ligneCommandes"> <collection element-type="LigneCommande"/> </field> </class> </package> </jdo> INF7115-Base de données 21 Les classes Java (Suite) package com.gestionCommande; import java.io.*; import java.util.*; import javax.jdo.*; public class ApplicationEnregistrerClient(){ public static void main(String[] args){ try{ InputStream propertyStream=new FileInputStream("jdo.properties"); Properties jdoproperties=new Properties(); jdoproperties.load(propertieStream); jdoproperties.putAll(new HashMap()); PersistenceManagerFactory pmf=JDOHelper.getPersistenceManagerFactory(jdoproperties); PersistenceManager pm=pmf.getPersistenceManager(); Transaction tx=pm.currentTransaction(); tx.begin(); Client cl=new Client("Pierre", "Judith", "235-3049", "2384 Rue St-Laurent, Montreal QC H2W 3E2", "[email protected]", "235-0394", "papa", "maman"); pm.makePersistent(cl); tx.commit(); } catch(Exception e){ e.printStackTrace(System.err); System.exit(-1); } } } INF7115-Base de données 22 Conclusion JDO est très jeune et n’est pas encore supporté par les plus grands acteurs du marché. Étant une API standard déjà implémentée par une quinzaine d’éditeurs, est présenté pour être intégré à J2EE 1.5. De ce fait, l’ensemble des éditeurs des serveurs applicatifs devront en fournir une implémentation. Les serveur JBOSS a par exemple déjà commencé le travail. Des acteurs importants comme Oracle ou même SAP ont commencé à travailler sur l’implémentation JDO. Donc, les bases de données relationnelles tiennent toujours fortement avec JDBC. INF7115-Base de données 23 7. Références Floyd Marinescu. Design Patterns EJB. Vuibert. 2002 Robin M. Ross. Java Data Objects. Addison Wesley. 2003 David Jordan & Craig Russell. Java Data Objects. O’Reilly. George Reese. Java Database Best Practices. O’Reilly Java Data Objects Specification JSR12. Sun Microsystems Inc. FastObjects J1 JDO Programmer’s Guide. Poet Software. Kodo JDO 3.2.2 Developer’s Guide. Solarmetric Inc. 2004 www.objectweb.org www.jdocentral.com www.versant.com www.xcalia.com www.java.sun.com http://www.jcp.org INF7115-Base de données 24 Merci. INF7115-Base de données 25 Questions ? INF7115-Base de données 26