330 likes | 417 Views
Etude d'approfondissement. Service de persistance JDO / Speedo Présentée par : François FORNACIARI. Plan. Introduction Présentation de JDO Une implémetation : Speedo Démonstration Conclusion. Plan. Introduction Présentation de JDO Une implémetation : Speedo Démonstration Conclusion.
E N D
Etude d'approfondissement Service de persistance JDO / Speedo Présentée par: François FORNACIARI
Plan • Introduction • Présentation de JDO • Une implémetation : Speedo • Démonstration • Conclusion
Plan • Introduction • Présentation de JDO • Une implémetation : Speedo • Démonstration • Conclusion
Introduction • Les applications Java ont besoin de stocker les objets qu'elles manipulent • Deux solutions : • Sérialisation : préserve les relations entre objets mais ne supporte pas le partage de ces objets • JDBC : mapping objet-relationnel réalisé par le développeur • L'accès aux données dépend de la façon dont elles sont stockées (multiples API)
Objetctifs • Dissocier la partie métier d'une application et les parties accès et manipulation de données stockées • Mettre en place un mécanisme de persistance transparent pour le développeur
Plan • Introduction • Présentation de JDO • Une implémentation : Speedo • Démonstration • Conclusion
Java Data Object : historique • Juin 1999 : JSR 12 approuvée (leader Craig Russel) • Aout 1999 : Formation d'un groupe d'experts (Apple, BEA, IBM, Oracle, SAP, SUN, etc. • Avril 2002 : sortie de la spécification JDO 1.0 • Février 2006 : JDO 2.0 (JSR 243)
Spécifications JDO • Supporter le modèle à objets (incluant les collections, l'héritage, ...) • Gestion de la persistance transparente (création automatique des tables, etc.) • Diversité des supports de stockage (SGBD relationnel ou objet, fichiers, fichiers XML, fichiers de propriétés, ...) • Gestion des transactions • Adaptée pour des architectures client/serveur ou multi-couches
Spécificités (1) • JDO apporte une généralisation des mécanismes de persistance à l'intégralité d'un projet (API haut niveau, support de nombreux drivers) • JDOQL permet d'interroger les objets grâce à une syntaxe Java Class empClass = Employee.class; Extent extEmployee = pm.getExtent (empClass, true); String filter = "salary > 30000"; Query q = pm.newQuery (extEmployee, filter); Collection emps = (Collection) q.execute ();
Spécificités (2) • JDO se combine efficacement avec des beans sessions et message-driven. • Pour des beans entité, JDO reste mieux adapté : • Séparation entre le modèle à composants et le modèle de persistance • Meilleures performances
Implémentations de JDO • Commerciales : • Versant, SolarMetric Kodo, Orient Technologies, Signsoft intelliBO, ... • Non-commerciales : • Speedo, JDOInstruments, Jakarta OJB, Apache Cocoon, XORM, JPOX, Triactive JDO, ...
Alternatives à JDO • Hibernate : plus simple à utiliser mais moins performant. Ne suit pas la spécification JDO. • TopLink : développé par Oracle
Plan • Introduction • Présentation de JDO • Une implémentation : Speedo • Démonstration • Conclusion
Présentation (1) • Implémentation open source des spécifications JDO (version 1.4.5) • Développé dans le cadre du consortium ObjectWeb • Intègre les projets suivants • JORM (persistance), MEDOR (données réparties), Perseus (cache, pool, concurrence, etc.), Fractal, Julia, ASM, Monolog • Grand nombre de bases de données supportées (Oracle, MS SQL server, Mysql, Postgres, ...)
Présentation (2) • Fournit des "ressources adapters" pour une intégration dans les serveurs d'applications tels que JOnAS, JBOSS, Weblogic • Un plugin Eclipse est disponible pour faciliter le développement d'applications JDO
Une application JDO (1) • L'objet à rendre persistant est un simple objet Java (POJO) • L'application possède un fichier xml .jdo (par package) qui décrit la persistance des objets <package name="simpleclass"> <class name="Address" identity-type="application" table="SIMPLE_ADDRESS"> <field name="street" primary-key="true" column="STREET"/> <field name="city" column="CITY"/> <field name="state" column="STATE"/> <field name="zip" column="ZIPCODE"/> </class> </package>
Une application JDO (2) • Possède un fichier de configuration (speedo-jdo.properties) qui spécifie • les propriétés concernant la base de données utilisée (nom, driver, identifiants, ...) • Les différentes politiques pour : • Les transactions • Le cache • Autres • Élément central JDO:le PersistanceManagerFactory renvoie un PM qui gère la persistance des objets.
Le modèle à objets • Speedo gère les concepts suivants : • Les compositions/agrégations d'objets • Les différentes relations : • 1 1 : un pour un • 1 n : un pour plusieurs • n m : associations • L'héritage entre objets • Concepts JDO avancés : • Attach/detach • Fetch plan
Principes de mise en œuvre • Les objets sont définis de différentes manières dans le fichier .jdo grâce à : • Un identifiant de l'objet persistant • Des champs primitifs et/ou complexes (Collection, List, Map, ...) • Des relations unidirectionnelles ou bidirectionnelles • Des classes mappées sur différentes base de données • De l'héritage • Des index, séquences • Etc.
Speedo et J2EE (1) • Intégration dans un serveur d'applications en tant que "ressource adaptor" • Le PersistanceManagerFactory est obtenu en utilisant le nom JNDI de l'instance de Speedo • Utilisation du TransactionManager présent dans JNDI • Les transactions sont spécifiées dans les EJB <container-transaction> <method> <ejb-name>BankApplication</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction>
Speedo et J2EE (2) • La création des structures de données (relations SQL) peut être faite grâce à une tâche Ant (si pas supportée dans une transaction) : les classes à traiter sont passées en paramètre à l'initialisation. • Possibilité d'accéder à de multiples sources de données
Manager <class name="Manager" identity-type="application"> <extension vendor-name="speedo" key="sql-name" value="T_MAPPING_MANAGER"/> <field name="name" primary-key="true"> <extension vendor-name="speedo" key="sql-name" value="NAME"/> </field> <!-- 1-1 relationship --> <field name="department" persistance-modifier="persistent"> <extension vendor-name="speedo" key="target-foreign-keys" value="LABEL=DPT_LABEL"/> <extension vendor-name="speedo" key="reverse-field" value="manager"/> </field> <!-- 1-N relationship --> <field name="employees" persistance-modifier="persistent"> <collection element-type="Employee"/> <extension vendor-name="speedo" key="source-foreign-keys" value="NAME=MANAGER_NAME"/> <extension vendor-name="speedo" key="reverse-field" value="manager"/> </field> </class>
Department <class name="Department" identity-type="application"> <extension vendor-name="speedo" key="sql-name" value="T_MAPPING_DEPARTMENT"/> <field name="label" primary-key="true"> <extension vendor-name="speedo" key="sql-name" value="LABEL"/> </field> <field name="manager" persistance-modifier="persistent"> <!-- 1-1 relationship already defined above--> </field> </class>
Employee <class name="Employee" identity-type="application"> <extension vendor-name="speedo" key="sql-name" value="T_MAPPING_EMPLOYEE"/> <field name="name" primary-key="true"> <extension vendor-name="speedo" key="sql-name" value="NAME"/> </field> <field name="manager" persistance-modifier="persistent"> <!-- 1-N relationship already defined above--> </field> <field name="projects" persistance-modifier="persistent"> <!-- M-N relationship --> <collection element-type="Project"/> <extension vendor-name="speedo" key="join-table" value="EMPLOYEE_TO_PROJECT"/> <extension vendor-name="speedo" key="source-foreign-keys" value="NAME=EMPLOYEE_NAME"/> <extension vendor-name="speedo" key="target-foreign-keys" value="TITLE=PROJECT_TITLE"/> <extension vendor-name="speedo" key="reverse-field" value="employees"/> </field> </class>
Project <class name="Project" identity-type="application"> <extension vendor-name="speedo" key="sql-name" value="T_MAPPING_PROJECT"/> <field name="title" primary-key="true"> <extension vendor-name="speedo" key="sql-name" value="TITLE"/> </field> <field name="employees" persistance-modifier="persistent"> <!-- M-N relationship already defined above--> <collection element-type="Employee"/> </field> </class>
Application cliente (1) • Exemple : persistanceManagerFactory pmf = JDOHelper.getpersistanceManagerFactory(property_file); Department department = new Department("Sales"); Manager manager = new Manager("François", department); department.setManager(manager); Employee employee = new Employee("Pierre", manager); PersistanceManager pm = pmf.getPersistanceManager(); pm.currentTransaction().begin(); pm.makePersistent(employee); pm.currentTransaction().commit(); pm.close();
Application cliente (2) • Suppression d’un département : pm.currentTransaction().begin(); … department = (Department) pm.getObjectById(id, true); pm.deletePersistent(department); … pm.currentTransaction().commit();
Plan • Introduction • Présentation de JDO • Une implémetation : Speedo • Démonstration • Conclusion
Plan • Introduction • Présentation de JDO • Une implémetation : Speedo • Démonstration • Conclusion
Conlusion • JDO offre des mécanismes de persistance très performants • Reste légèrement plus complexe à utiliser que son concurrent direct (Hibernate) • JDO 2.2 devrait supporter Java 1.5 (Annotations, Enum, …) • Speedo devrait (entre autre) implémenter la spécification EJB 3.0