Persistance

Home

Persistence.

Besoin

Enregistrer un état de manière permanente.

Il n'y aurait pas besoin de persistance si la mémoire de travail des ordinateurs :

Analyse

Sauvegarder l'état d'un objet consiste à enregistrer la valeur de l'ensemble de ses champs (attributs), qu'ils soient :

Cas d'utilisation

Il existe plusieurs cas où l'on a besoin d'un mécanisme de persistance. Tous impliquent un modèle objet et un modèle de stockage :

Dans tous les cas, une formalisation de la correspondance (mapping) entre les 2 modèles devra être produite.

Conception

Alors que la persistance d'objets est relativement naturelle dans un SGBD utilisant le même paradigme (SGBDO), elle vise la plupart du temps un stockage dans selon un paradigme relationnel (SGBDR). Dans ce dernier cas doit être mis en place une correspondance (mapping) entre le modèle objet et le modèle de la base relationnelle (Object/Relational ou O/R).

Héritage

On peut représenter un héritage objet via un mapping relationnel :

Mappings d'héritage
  Vertical Horizontal Filtré ou "plat" (flat)
Contraintes schéma Nombre de tables par hiérarchie 3ème forme normale : 1 par classe (concrète ou abstraite) 1 par classe concrète 1 pour l'ensemble des classes
Mécanisme de typage Fonction de la table pour les classes concrètes. Stocké dans une colonne discriminante ou dans une table annexe pour les classes abstraites Fonction de la table Stocké dans par une colonne discriminante
Evolutivité Modification de classes ancètres Modification de la table de la classe ancêtre Modification de toutes les tables Modification de la table unique
Modification/ajout de classes dérivées Modification/ajout de tables Modification/ajout de tables Modification de la table unique
Performance Lecture sans relation Mauvais Moyen Bon
Lecture avec relation Bon Mauvais Moyen
Contraintes Espace alloué Minimal Moyen Grand
Intégrité Très adapté Moyennement adapté Pas adapté

Relations

On peut représenter des relations via un mapping relationnel :

Mapping de relation Simple Entité Inversée
Contraintes schéma Principe La table source contient une clé étrangère vers la destination 1 Table intermédiaire contient les clés des objets liés La table destination contient une clé étrangère vers la source
Performance/ type de relation 1-1 Bon Mauvais Moyen
1-n Impossible Moyen Bon
n-m Bon Impossible

Cependant le mapping peut se révéler plus complexe lorsqu'il faut garantir des contraintes :

Exemples

Des exemples de solutions de persistance sont :

Solutions de persistance Solution CocoBase Castor-JDO Entités EJB Hibernate JDBC JDO ObjectSpaces ODMG SDO Serialisation TopLink Torque Versant Commentaire
Version 4.5 0.9 1 2 2   1 2         9.0.3 3.1  
Transactions Explicites   JTA

JTA

JTA Oui javax.jdo. Transaction ou JTA Oui Transaction tx = odmg. newTransaction()   Non     Oui tx.begin, tx.commit
Implicites Si encapsulsé dans EJB Non transaction-attribute (Descripteur) Si encapsulsé dans EJB Non Oui si en environnement géré (JCA) et encapsulé dans EJB DataSet ? Non   Non Si encapsulsé dans EJB Si encapsulsé dans EJB Si intégré dans un serveur applicatif et encapsulsé dans EJB Démarcation, propagation spécifiées en dehors du code.
Pessimistes   Exclusive Oui Oui Oui Oui Oui Oui   Non     Oui Verrous
Optimistes Oui Shared Non Oui Non Oui   Oui   Non Oui   Oui Sans verrous
Distribuées JTS JTS JTS JTA+JTS JTS JTS Non Non   Non       Support de XA
Mémoire     Non   Non Oui   Non   Non     Non Commit ou rollback d'opérations en mémoire
Cycle de vie Callbacks     EntityBean   API InstanceCallbacks InstanceCallbacks extends LoadCallback, StoreCallback,
ClearCallback, DeleteCallback
  Non   readObject, writeObject...       Avant/après lecture, mise à jour, suppression
Requêtes Langage objet EJB-QL, API CBQuery Builder Castor OQL SQL EJBQL HQL SQL JDOQL OPath OQL Non imposé Non TopLink Expression, EJB QL, PL/SQL API Criteria OQL  
Projections, vues     Non   Oui Non query.setResult(this ou champ ou variable, expression navigationnelle, paramètre)   Oui   Non        
Fonctions aggrégats     Non   Oui Non query.setResult(count ou sum ou min ou max ou avg ou expression numérique)   Oui   Non        
SQL possible   Database:: getOQLQuery ("CALL SQL ...") Dépend des implémentations   Oui Dépend des implémentations

q = pm.newQuery ("javax.jdo.query.SQL", "SELECT ...")

      Non        
Accès au code   Non Non Non Non Non Non Oui   Non Non   Oui Invocation de méthodes dans des requêtes typiquement
Performance Cache Oui Oui Oui Oui Non Oui   Oui   Non Oui Managers Oui  
Détection des modifications     Non Proxy Non Enhancement   Oui   Non   Via les accesseurs (mutators)    
Transparence Accès aux informations Réflexivité Java Réflexivité Java Réflexivité Java Réflexivité Java API Enhancement API     Réflexivité Java Réflexivité Java Code généré Enhancement  
Relations (1-n, n-m) Oui Oui Non via accesseurs Oui N/A Oui   Oui   Oui Oui Oui Oui  
Héritage Oui Oui Non Oui N/A Oui (méthode(s) dépendant de l'implémentation) <inheritance strategy="new-table" ou "superclass-table" ou "no-table">   Oui   Oui Oui Plat Oui  
Collections Java     Collection, Set   Non Oui   DBag, DSet, DList, DArray, DMap   Oui   Oui    
Persistance de proche en proche     Non   N/A Oui   Oui   Oui       Persistence by reachability
Non intrusion dans le code des objets métier   Méthodes d'accès aux données obligatoires Implémentation de SessionBean, EntityBean, MessageDrivenBean Méthodes d'accès aux données obligatoires API JDBC Oui Classe abstraite comportant des méthodes OnCreate, etc. Non   Implémentation de Serializable Méthodes d'accès aux données obligatoires Héritage de code généré Oui Pour maintenabilité et réutilisabilité des objets métier.
Accès au graphe d'objets dépendants     Non   Non Oui Non Oui   Non     Oui  
Accès au modèle métier   Oui Oui Oui Non Oui Oui Oui   Non     Oui  
Mapping Multi-tables   Oui Dépend de l'implémentation   Non Dépend de l'implémentation <join table="DELIV" column="ADDR_STREET"/>       Flux (fichier) Oui   Base objet  
Top-down Oui   Dépend de l'implémentation   Non Dépend de l'implémentation       Ecriture de fichier     Oui Génération du schéma de la base à partir du modèle objet
Bottom-up Oui   Dépend de l'implémentation   Non Dépend de l'implémentation       Non       Génération du modèle objet à partir du schéma d'une base existante
Granularité fine     Objet   Via SQL Champ       Objet     Oui  
Stockage Paradigme libre   SGBDR, XML, LDAP Non spécifié (mais généralement SGBDR) SGBDR SGBDR Oui (via JCA) SGBDR, XML SGBDO, SGBDR   Flux (fichier) SGBDR SGBDR

Versant

 
Support d'une base existante   Oui Oui Oui Manuel Oui   Identité imposée   Flux (fichier) Oui Oui Versant  
Portabilité API standard Produit org.exolab.castor javax.ejb cirrus.hibernate java.sql, javax.sql javax.jdo Microsoft. ObjectSpaces org.odmg   java.io Produit Apache DB com.versant Un standard offre un plus large choix d'implémentations (moins de risque de vendor-locking) et une meilleure perennité
J2ME     Non         Windows .Net              
J2SE 1.2   Non 1.2 1.1 1.2 1.3 1.1   1.1     1.2  
J2EE WAS, WLS, OAS, BES...   1.2 1.3   1.2 1.3 (JCA)       1.2 WAS, WLS, OAS   WAS, WLS...  
Implémentations     BEA, IBM, Oracle...   Sun, IBM... Xcalia, SolarMetrics, Hemisphere...   Poet...   Sun, IBM...   Apache    
Utilisabilité Modèle statique     EJB   Non POJO                
Modèle dynamique     Non   Texte SQL, noms de colonnes, etc. Non                
Métadonnées     Fichier XML   API Introspection Java, métadonnées de persistance XML     Interrogeables          
Licence   Thought, Inc. Style BSD J2EE LGPL J2SE Variable MicroSoft   IBM, BEA J2SE   Apache Versant  

Limitations

La persistance de certaines informations devient problématique lorsque ces informations ne sont :

Voir

Home  |  Contact