500 likes | 591 Views
Gestion de la persistance des objets. CSC4002 Claire Lecocq. Plan du document. Motivations Application exemple : la médiathèque Problématique en image Quel schéma de Base de Données Relationnelle ? Gérer la persistance dans Java : JDBC Conclusion. Application exemple : la médiathèque.
E N D
Gestion de la persistance des objets CSC4002 Claire Lecocq janvier 14
Plan du document • Motivations • Application exemple : la médiathèque • Problématique en image • Quel schéma de Base de Données Relationnelle ? • Gérer la persistance dans Java : JDBC • Conclusion janvier 14
Application exemple : la médiathèque • Développement objet : standard de fait • Où sont stockées les données ? • Durée de vie ? • Partage ? • Volume de données ? • Une idée ? janvier 14
Problématique en image Application UML Développement Objet Mapping chargement déchargement Stockage des données Modèle E/A Relationnel SGBD janvier 14
Plan du document • Motivations • Quel schéma de Base de Données Relationnelle ? • Processus de conception d’une BD (rappel) • Entité/Association versus diagramme de classes UML • Existe t-il un modèle relationnel pour un diagramme de classes ? • Diagramme de classes de la médiathèque • Traduction du diagramme en dehors de l’arbre d’héritage • Héritage • Revenons sur la sémantique de l’héritage1 • Traduction de l’héritage en modèle relationnel • Gérer la persistance dans Java : JDBC 1 la généralisation/spécialisation est appelée dans ce cours héritage janvier 14
Processus de conception d’une BD (rappel) Monde réel Indépendant du SGBD Recueil des besoins et analyse Contrat Besoin de la BD Prise en compte des particularités du SGBD Conception logique Schéma conceptuel (haut niveau) E/A UML Transformation du modèle Spécifique à un SGBD Relationnel Réseau Hiérarchique Schéma conceptuel (spécifique SGBD) Conception physique Placement Disque Optimisation Schéma physique (spécifique SGBD) janvier 14
Entité/Association versus diagrammes de classes et d’objets UML Modèles de conception janvier 14
Existe t-il un modèle relationnel pour un diagramme de classes ? • Si • Hypothèse 1 : existe correspondance E/A diagramme de classes • Hypothèse 2 : existe traduction E/A relationnel • Alors • Transformer un diagramme de classes UML (partie statique) en un schéma relationnel « équivalent » peut se ramener à la transformation d’un schéma E/A vers un schéma relationnel • Problème hypothèse 1 : héritage janvier 14
Diagramme de classes de la médiathèque janvier 14
Traduction du diagramme en dehors de l’arbre d’héritage • Classe façade janvier 14
Traduction du diagramme en dehors de l’arbre d’héritage • Classes persistantes janvier 14
Règles de traduction • Classe => entité • Attribut d’instance -> attribut d’entité • Adapter au mieux les correspondances de types • Définir la clé de l’entité • Association, agrégation => association • Composition => entité faible • Multiplicités => cardinalités janvier 14
Traduction du diagramme en dehors de l’arbre d’héritage • Modèle entité/association Localisation salle : varchar(20) rayon : varchar(5) FicheEmprunt dateEmprunt : date dateLimite : date depasse : integer Genre nom : varchar(20) nbEmprunts : integer Categorie nom : varchar(20) nbEmpruntsMax : integer tarifInscription : float coefDuree : float coefTarif : float codeReducUsed : integer 1,1 correspondre 0,n Client nom : varchar(20) prenom : varchar(20) adresse : varchar(20) nbEmpruntsEffectues : integer nbEmpruntsDepasses : integer nbEmpruntsEnCours : integer dateInscription : date codeReduction : integer dateRenouvellement : date 0,n appartenir 1,1 janvier 14 13
Traduction du diagramme en dehors de l’arbre d’héritage • Modèle relationnel Localisation salle : varchar(20) rayon : varchar(5) FicheEmprunt dateEmprunt dateLimite depasse nom prenom Genre nom : varchar(20) nbEmprunts : integer Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours dateInscription codeReduction dateRenouvellement catclient janvier 14 14
Il reste la partie la plus intéressante : l’arbre d’héritage ! Localisation salle : varchar(20) rayon : varchar(5) FicheEmprunt dateEmprunt dateLimite depasse nom prenom Genre nom : varchar(20) nbEmprunts : integer Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours dateInscription codeReduction dateRenouvellement catclient janvier 14 15
Revenons sur la sémantique de l’héritage (1) Etudiant noEtud cycle Salarie salaire Prive prime Public indice • Classe enfant hérite des attributs de sa classe parent • Spécialisation peut être : • Totale : toute instance est spécialisée dans au moins une classe enfant Classe abstraite • Partielle : une instance peut ne pas être spécialisée Personne nom prénom adresse Personne = Etudiant Salarie Partielle X Totale Salarie = Prive Public janvier 14
Revenons sur la sémantique de l’héritage (2) Etudiant noEtud cycle Salarie salaire Prive prime Public indice • Spécialisation peut être : • Partition : une instance est spécialisée dans au plus une classe enfant • Recouvrement : une instance peut être spécialisée dans plusieurs classes enfants Héritage multiple Personne nom prénom adresse Etudiant Salarié Recouvrement Partition Doctorant vacataire Prive Public = janvier 14
Traduction de l’héritage en modèle relationnel • 3 correspondances possibles : • Correspondance directe • Correspondance ascendante • Correspondance par aplatissement 3.1. Pour partition 3.2. Pour recouvrement • Ne s’appliquent pas à toutes les typologies d’arbre d’héritage • totale/partielle • partition/recouvrement janvier 14
Correspondance directe (n° 1) Relation clé Contrainte d’intégrité référentielle • Une classe une relation BD • Liaison entre les relations se fait via la clé • Correspondance de l’arbre de Document Document code titre auteur annee empruntable emprunte nbEmprunts Création d’une clé Audio code classification Video code dureeFilm mentionLegale Livre code nbPages Clé + clé étrangère janvier 14
Correspondance directe (n° 1) - suite Relation clé Contrainte d’intégrité référentielle Document code titre auteur annee empruntable emprunte nbEmprunts Typedoc Classification nombrePages Durrefilm Mentionlegale • create view vueDocument(code, titre, auteur, annee, empruntable, emprunte, salle,rayon,nomGenre,nbEmprunts, typedoc, classification, nombrePages, dureeFilm, mentionLegale) as • select document.code, titre, auteur, annee, empruntable, emprunte, salle,rayon,nomGenre,nbEmprunts,'Audio', classification, null, null, null • from audio, document • where audio.code = document.code • union • select document.code, titre, auteur, annee, empruntable, emprunte, salle,rayon,nomGenre,nbEmprunts,'Video', null, null, dureeFilm, mentionLegale • from video, document • where video.code = document.code • union • select document.code, titre, auteur, annee, empruntable, emprunte, salle,rayon,nomGenre,nbEmprunts,'Livre', null, nombrePages, null, null • from livre, document • where livre.code = document.code ; Document code titre auteur annee empruntable emprunte nbEmprunts Vue Audio code classification Video code dureeFilm mentionLegale Livre code nbPages Construction de la vue par requête janvier 14
Correspondance directe pour la médiathèque Document code titre … Dénormalisation Audio code classification FicheEmprunt nom prenom code dateEmprunt dateLimite depasse Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours catclient dateInscription codeReduction dateRenouvellement Document code titre auteur annee empruntable emprunte nbEmprunts nomGenre salle rayon Video code dureeFilm mentionLegale Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed Livre code nbPages Localisation salle rayon Solution retenue pour le TP Genre nom nbEmprunts janvier 14
Correspondance directe et typologie des arbres d’héritage janvier 14
Correspondance ascendante (n° 2) • Chaque classe spécialisée une relation BD • Classe parent une vue • Correspondance de l’arbre de Document • CREATE VIEW Document AS • SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts FROM Audio • UNION SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts FROM Video • UNION SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts FROM Livre Document code titre auteur annee empruntable emprunte nbEmprunts Audio code titre auteur annee empruntable emprunte nbEmprunts classification Video code titre auteur annee empruntable emprunte nbEmprunts dureeFilm mentionLegale Livre code titre auteur annee empruntable emprunte nbEmprunts nbPages Vue Construction de la vue par requête janvier 14
Correspondance ascendante pour la médiathèque • Une vue n’est pas une relation BD ! • Pas de clé, non référençable par une clé étrangère FicheEmpruntAudio code nom prenom Audio code FicheEmpruntVideo code nom prenom Client nom prenom Document code Video code FicheEmpruntLivre code nom prenom Livre code FicheEmprunt janvier 14
Correspondance ascendante et typologie des arbres d’héritage janvier 14
Correspondance par aplatissement (n° 3.1) • Ensemble des classes de la hiérarchie une seule relation BD • Éventuellement chaque classe une vue • Correspondance de l’arbre de Document Document code titre auteur annee empruntable emprunte nbEmprunts typeDocument classification dureeFilm mentionLegale nbPages • CREATE VIEW Audio AS • SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts, classification • FROM Document • WHERE typeDocument=‘Audio’ Audio code … classification Video code … dureeFilm mentionLegale Livre code … nbPages janvier 14
Correspondance par aplatissement 3.1 pour la médiathèque Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours typeClient dateInscription dateRenouvellement codeReduction dateCotisation FicheEmprunt nom prenom code dateEmprunt dateLimite depasse Genre nom nbEmprunts Document code titre auteur annee empruntable emprunte nbEmprunts nomGenre salle rayon typeDocument classification dureeFilm mentionLegale nbPages Localisation salle rayon Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed Solution retenue pour le TP janvier 14
Correspondance par aplatissement 3.1 et typologie des arbres d’héritage janvier 14
Correspondance par aplatissement 3.2 pour la médiathèque • Variante de la correspondance 3.1 avec utilisation d’un attribut booléen supplémentaire par classe enfant • Si un document pouvait être à la fois un Audio et une Vidéo … Document code titre auteur annee empruntable emprunte nbEmprunts AudioB VideoB LivreB Classification dureeFilm mentionLegale nbPages • CREATE VIEW Audio AS • SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts, classification • FROM Document • WHERE AudioB = 1 janvier 14
Correspondance par aplatissement 3.2 et typologie des arbres d’héritage janvier 14
QCM – Vrai ou faux • Les types des langages objets et les types des bases de données correspondent parfaitement • Il y a toujours un modèle relationnel « correspondant » à un diagramme de classe • Le nombre de relation dans le modèle relationnel est égal au nombre de classe dans le diagramme de classe • Une classe abstraite est toujours traduite par une vue • S’il existe plusieurs modèles relationnels « correspondant » à un diagramme de classe, je choisi au hasard, il n’y a pas de critère de choix janvier 14
Plan du document • Motivations • Quel schéma de Base de Données Relationnelle ? • Gérer la persistance dans Java : JDBC • Qu’est ce que JDBC ? • Que faire pour pouvoir utiliser JDBC ? • Principaux objets mis en œuvre • Les tuyaux de communication : Connection et Statement • Exécution d’une requête : ResultSet • Correspondance de type : exemple sur les chaînes de caractères • Étapes d’interaction avec le SGBD • Politique de gestion de la persistance janvier 14
Qu’est ce que JDBC ? • Java DataBase Connectivity • API Java pour accéder à des SGBDR via SQL • Indépendance / SGBD cible (via des pilotes) • Fourni par le paquetage java.sql • Interfaces • Implémentées dans les pilotes (en anglais driver) • Dépendants des SGBDs cibles • « Tout » SGBD a un pilote JDBC • 4 catégories de pilotes en fonctions de : • La présence ou non de pilote SGBD (non Java) sur le client • Protocole de communication entre le client Java et le serveur Application java Pilote Protocole du SGBD SGBD Type 4 janvier 14
Que faire pour pouvoir utiliser JDBC ? • Avoir un pilote • Le référencer dans le CLASSPATH • Dans chaque classe qui utilise des ordres JDBC • Importer le paquetage java.sql import java.sql.*; • Charger en mémoire la classe du (des) pilote(s) avant d’utiliser JDBC : Class.forName("oracle.jdbc.OracleDriver"); Class.forName("com.mysql.jdbc.Driver" ); Class.forName("org.postgresql.Driver" ); janvier 14
Les tuyaux de communication Connection et Statement SGBD PostgresSQL Application java Media : Mediatheque Statement statement1 « SELECT * FROM Document » Nom : string …. Connection : @Connection Pilote MySQL Statement statement2 Constructeur() rechercheBD() miseAJourBD() Destructeur() Statement statement3 janvier 14
Exécution d’une requête ResultSet SGBD PostgresSQL Localisation Application java Media : Mediatheque Statement stmt1 ResultSet rset = stmt1.executeQuery ("select * from localisation"); Nom : string …. lesLocalisations: collection de @Localisation Pilote MySQL janvier 14
Correspondance de typesExemple sur les chaînes de caractères SGBD PostgresSQL Localisation salle : varchar(20) Application java String salle Statement stmt1 rset contient "select * from localisation"); while (rset.next()) { … String salle = rset.getString("salle"); … } janvier 14
Étapes d’interaction avec le SGBD • Ouvrir une connexion • Instance de Connection • Créer des « fils » pour supporter l’envoi d’instructions SQL au sein de la connexion • Requête dans une instance de Statement ou PreparedStatementou CallableStatement • Demander l’exécution de ces instructions par le SGBD : • Requête d’interrogation (SELECT) : méthodeexecuteQuery() sur le *Statement • Requête de mise à jour (INSERT, UPDATE, DELETE) : méthodeexecuteUpdate() sur le *Statement • autre ordre SQL(appel de procédure stockée) :execute() sur le *Statement • Fermer la connexion : méthode close() sur la connexion janvier 14
1. Établir une connexion String driver = "org.postgresql.Driver"; String urlBd = "jdbc:postgresql://monServeur.monDomaine.fr/maBaseDeDonnees"; try { Class.forName(driver).newInstance(); }catch(Exception cnfe) { throw new OperationImpossible("Echec acces Pilote BD- " + driver + " " + cnfe); } compte = "monLogin"; passe = "monPasse"; try { laConnexion = DriverManager.getConnection(urlBd,compte,passe); } catch(SQLExceptionqe) { throw new OperationImpossible("Echec connexion BD- " + qe + " " + urlBD); } janvier 14
2 et 3. Exécuter une requête SELECT (1) Statementstmt ; try { stmt = laConnexion.createStatement(); ResultSetrset = stmt.executeQuery ("select * from localisation"); while (rset.next()) { String s = rset.getString("salle"); String r = rset.getString("rayon"); Localisation loc = new Localisation(s,r); lesLocalisations.addElement(loc); } } catch(SQLException se) { throw new OperationImpossible("Echec acces Localisation- " +se.getMessage()); } janvier 14
2 et 3. Exécuter une requête SELECT (2) La méthode executeQuery() • executeQuery() renvoie une instance de ResultSet • L’instance de ResultSet se parcourt itérativement ligne par ligne • Les colonnes sont référencées par leur numéro ou par leur nom • L'accès aux valeurs des colonnes se fait par les méthodes • getXXX() où XXX représente le type de l'objet • ou bien par un getObject() suivi d’une conversion explicite janvier 14
Correspondance de type SQL/Java (1) janvier 14
Correspondance de type SQL/Java (2) • Pas de booléen en bases de données ! • Document : • empruntable et emprunte : boolean dans le diagramme de classe • empruntable et emprunte : integer dans la base de données ResultSetrset = stmt.executeQuery("select * from document"); while (rset.next()) { … boolean empruntable = rset.getInt("empruntable") > 0; boolean emprunte = rset.getInt("emprunte") > 0; … } janvier 14
2 et 3. Exécuter une requête de mise à jour (1) private void insererBD(Document doc) throws OperationImpossible { try { PreparedStatement stmt; if (doc instanceof Audio ){ Audio au = (Audio) doc; stmt = laConnexion.prepareStatement("INSERT INTO document (code, titre, auteur, annee, empruntable, emprunte, salle, rayon, nomgenre, nbemprunts, typedoc, classification) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'Audio', ?)"); stmt.setString(11, au.getClassification()); } else { // Video puis Livre } janvier 14
2 et 3. Exécuter une requête de mise à jour (2) stmt.setString(1, doc.getCode()); stmt.setString(2, doc.getTitre()); stmt.setString(3, doc.getAuteur()); stmt.setString(4, doc.getAnnee()); stmt.setInt(5,doc.estEmpruntable()?1:0); stmt.setInt(6, doc.estEmprunte()?1:0); stmt.setString(7, doc.getLocalisation().getSalle()); stmt.setString(8, doc.getLocalisation().getRayon()); stmt.setString(9, doc.getGenre().getNom()); stmt.setInt(10, doc.getNbEmprunts()) } catch (SQLException e) { throw new OperationImpossible("Echec insertion BD- " + e); } } janvier 14
QCM - Vrai/faux • Je peux me passer de « driverr » pour interagir avec le SGBD • Je crée une connexion (objet connection) à chaque fois que je dois interagir avec le SGBD. Je la referme après chaque interaction • En fonction du type de requête SQL à exécuter, je choisis judicieusement le type de Statement à utiliser • Un ResultSet peut contenir de nombreux « tuples » • Les types java et les types de bases de données correspondent parfaitement • La méthode prepareStatement est utilisée pour les requêtes paramétrées janvier 14
Politique de gestion de la persistance • Comment intégrer le code JDBC qui assure le chargement et le déchargement des objets Java depuis la BD • En structurant au mieux le code (limiter le nombre d’opérations à modifier) • Quel(s) objet(s) charger et quand ? • Quel(s) objet(s) décharger et quand ? janvier 14
Chargement / déchargement (1) • Chargement • Constructeur d’objet intégrant tous les attributs • Statique : constructeur de « collections » • Similaire au TP médiathèque sérialisée • Volume de données contrôlé • Dynamique : constructeur d’objet (nécessité d’une clé pour sélectionner l’objet) • Charger les objets connexes • Déchargement • Statique : à la fin du programme (attention aux pertes d’infos) • Dynamique : dans les opérations de mise à jour janvier 14
Chargement / déchargement (2) • Statique • Adapté aux petits volumes de données • Faible taux de mises à jour • Simple à mettre en œuvre • Dynamique • Adapté aux volumes de données importants • Fort taux de mises à jour • Meilleure résistance aux fautes • Plus compliqué à programmer janvier 14
Conclusion • 1 diagramme de classe • Plusieurs modèle relationnels pour la persistance • Savoir choisir • JDBC : une solution technique • « bas » niveau • Frameworks • Hibernate, TopLink • Proposition de modèles de persistance • Méthodes « haut » niveau pour interagir avec le SGBD • Questions ? janvier 14