500 likes | 657 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 2014
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 2014
Application exemple : la médiathèque • Développement orienté objet : standard de fait • Où sont stockées les données ? • Durée de vie ? • Partage ? • Volume de données ? • Une idée ? Janvier 2014
Problématique en image Application UML Développement Objet Mapping chargement déchargement Stockage des données Modèle E/A Relationnel SGBD Janvier 2014
Plan du document • Motivations • Quel schéma de Base de Données Relationnelle ? • Processus de conception d’une BD (rappel) • 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 2014
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 2014
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 • Voir cours CSC4001 : Introduction aux BD relationnelles • Diapositives 13 et 14 pour la médiathèque • 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 Janvier 2014
Hypothèse 1 : CorrespondanceE/A diagrammede classes Janvier 2014
Hypothèse 1 : CorrespondanceE/A diagrammede classes Problème héritage Janvier 2014
Diagramme de classes de la médiathèque Janvier 2014
Traduction du diagramme en dehors de l’arbre d’héritage • Classe façade Janvier 2014
Traduction du diagramme en dehors de l’arbre d’héritage • Classes persistantes Janvier 2014
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 2014
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 2014
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 2014
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 2014
Revenons sur la sémantique de l’héritage (1) Etudiant noEtud cycle Salarie salaire Prive prime Public indice • Spécialisation peut être : • Partielle : une instance peut ne pas être spécialisée* • Totale : toute instance est spécialisée dans au moins une classe enfant* Personne nom prénom adresse X Personne Etudiant Salarie Partielle Totale Salarie = Prive Public * Dans les cours UML et Java, les termes utilisés sont classes abstraites et classes concrètes Janvier 2014
Revenons sur la sémantique de l’héritage (2) Etudiant noEtud cycle Salarie salaire Prive prime Public indice • Spécialisation peut être : • Recouvrement : une instance peut être spécialisée dans plusieurs classes enfants* • Partition : une instance est spécialisée dans au plus une classe enfant Personne nom prénom adresse Etudiant Salarié Recouvrement Partition Doctorant vacataire Prive Public = • Dans les cours UML et Java, l’héritage multiple a été ignoré pour raison de simplicité et • aussi parce que Java ne l’autorise pas (contrairement à C++) Janvier 2014
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 Janvier 2014
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 2014
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 createviewvueDocument(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 whereaudio.code = document.code union select document.code, titre, auteur, annee, empruntable, emprunte, salle,rayon,nomGenre,nbEmprunts,'Video', null, null, dureeFilm, mentionLegale fromvideo, document wherevideo.code = document.code union select document.code, titre, auteur, annee, empruntable, emprunte, salle,rayon,nomGenre,nbEmprunts,'Livre', null, nombrePages, null, null from livre, document wherelivre.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 2014
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 2014
Correspondance directe et typologie des arbres d’héritage Janvier 2014
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 2014
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 2014
Correspondance ascendante et typologie des arbres d’héritage Janvier 2014
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 2014
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 2014
Correspondance par aplatissement 3.1 et typologie des arbres d’héritage Janvier 2014
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 2014
Correspondance par aplatissement 3.2 et typologie des arbres d’héritage Janvier 2014
QCM – Vrai ou faux • Il y a toujours un modèle relationnel « correspondant » à un diagramme de classes • Le nombre de relations dans le modèle relationnel est égal au nombre de classes dans le diagramme de classes • Une classe abstraite est toujours traduite par une vue • S’il existe plusieurs modèles relationnels « correspondant » à un diagramme de classes, je choisis au hasard : il n’y a pas de critère de choix Janvier 2014
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 • Tuyaux de communication : Connection et Statement • Exécution d’une requête : ResultSet • Correspondance de type • Exemple sur les chaînes de caractères • Correspondance de type SQL/Java • Étapes d’interaction avec le SGBD • Politique de gestion de la persistance • Conclusion Janvier 2014
Qu’est ce que JDBC ? • Java DataBaseConnectivity • 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 Application java Pilote Protocole du SGBD SGBD Janvier 2014
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 2014
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 2014
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 2014
Correspondance de types : Exemple 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 2014
Correspondance de type SQL/Java (1) Janvier 2014
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 2014
É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 non paramétrée dans une instance de Statement • Requête paramétrée dans une instance de PreparedStatement INSERT INTO localisation (salle, rayon) values (?, ?) • 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 • Fermer la connexion : méthode close() sur la connexion Janvier 2014
1. Établir une connexion String driver = "org.postgresql.Driver"; String urlBd = "jdbc:postgresql://mysql-inf/TPCONCEPTION"; try { Class.forName(driver).newInstance(); }catch(Exception cnfe) { throw new OperationImpossible("Echec acces Pilote BD- " + driver + " " + cnfe); } Statement stmt = null; try { laConnexion = DriverManager.getConnection(urlBd,compte,passe); } catch(SQLException qe) { throw new OperationImpossible("Echec connexion BD- " + qe + " " + urlBD); } 2012
2 et 3. Exécuter une requête de mise à jour (1) privatevoidinsererBD(Document doc) throwsOperationImpossible { try { PreparedStatementstmt; 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 2014
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 2014
QCM - Vrai/faux • Je peux me passer de « driver » 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 la méthode execute* à 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 2014
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 2014
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’information) • Dynamique : dans les opérations de mise à jour Janvier 2014
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 2014
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 2014
Conclusion • 1 diagramme de classes • Plusieurs modèles relationnels pour la persistance • Savoir choisir • Schéma relationnel • Relation + attributs avec des domaines+ clé + contraintes d’intégrité • JDBC : une solution technique • « bas » niveau • Canevas logiciels industriels • Hibernate, TopLink • Proposition de modèles de persistance • Méthodes « haut » niveau pour interagir avec le SGBD Janvier 2014