1 / 50

Gestion de la persistance des objets

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.

yakov
Download Presentation

Gestion de la persistance des objets

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Gestion de la persistance des objets CSC4002 Claire Lecocq janvier 14

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. Entité/Association versus diagrammes de classes et d’objets UML Modèles de conception janvier 14

  8. 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

  9. Diagramme de classes de la médiathèque janvier 14

  10. Traduction du diagramme en dehors de l’arbre d’héritage • Classe façade janvier 14

  11. Traduction du diagramme en dehors de l’arbre d’héritage • Classes persistantes janvier 14

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

  20. 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

  21. 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

  22. Correspondance directe et typologie des arbres d’héritage janvier 14

  23. 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

  24. 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

  25. Correspondance ascendante et typologie des arbres d’héritage janvier 14

  26. 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

  27. 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

  28. Correspondance par aplatissement 3.1 et typologie des arbres d’héritage janvier 14

  29. 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

  30. Correspondance par aplatissement 3.2 et typologie des arbres d’héritage janvier 14

  31. 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

  32. 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

  33. 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

  34. 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

  35. 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

  36. 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

  37. 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

  38. É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

  39. 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

  40. 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

  41. 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

  42. Correspondance de type SQL/Java (1) janvier 14

  43. 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

  44. 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

  45. 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

  46. 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

  47. 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

  48. 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

  49. 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

  50. 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

More Related