Gestion de la persistance des objets CSC4002 Claire Lecocq Institut Mines-Télécom Janvier 2014 Plan du document 1. Motivations 1. Application exemple : la médiathèque 2. Problématique en image 2. Quel schéma de Base de Données Relationnelle ? 3. Gérer la persistance dans Java : JDBC 4. Conclusion 2 Institut Mines-Télécom 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 ? 3 Institut Mines-Télécom Janvier 2014 Problématique en image Application UML Développement Objet Mapping chargement Stockage des données déchargement Modèle E/A Relationnel SGBD 4 Institut Mines-Télécom Janvier 2014 Plan du document 1. Motivations 2. 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 3. Gérer la persistance dans Java : JDBC 4. Conclusion 1 5 la généralisation/spécialisation est appelée dans ce cours héritage Institut Mines-Télécom Janvier 2014 Processus de conception d’une BD (rappel) Besoin de la BD Prise en compte des particularités du SGBD Contrat Conception logique Schéma conceptuel (haut niveau) E/A UML Indépendant du SGBD Monde réel Recueil des besoins et analyse Transformation du modèle Conception physique Schéma physique (spécifique SGBD) 6 Institut Mines-Télécom Placement Disque Optimisation Janvier 2014 Spécifique à un SGBD Schéma conceptuel (spécifique SGBD) Relationnel Réseau Hiérarchique 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 ● 7 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 Institut Mines-Télécom Janvier 2014 Hypothèse 1 : Correspondance E/A diagramme de classes SI-BD Entité/Association Génie logiciel - langages Diagramme de classes Entité Classe Entité faible Composition Association sans attribut Association Association avec attribut(s) Classe d’association Pas de correspondance Héritage – Généralisation, spécialisation Clé Identité d’objet Attribut calculé 8 Attribut dérivé Opération Cardinalités Multiplicités Attribut d’une entité de paramètres Attributs de classe Institut Mines-Télécom Janvier 2014 Hypothèse 1 : Correspondance E/A diagramme de classes SI-BD Entité/Association Génie logiciel - langages Diagramme de classes Entité Classe Entité faible Composition Association sans attribut Association Association avec attribut(s) Classe d’association Pas de correspondance Héritage – Généralisation, spécialisation Clé Identité d’objet Attribut calculé Problème héritage Attribut dérivé Opération Cardinalités Multiplicités Attribut d’une entité de paramètres Attributs de classe 9 Institut Mines-Télécom Janvier 2014 Diagramme de classes de la médiathèque 10 Institut Mines-Télécom Janvier 2014 Traduction du diagramme en dehors de l’arbre d’héritage ■ Classe façade 11 Institut Mines-Télécom Janvier 2014 Traduction du diagramme en dehors de l’arbre d’héritage ■ Classes persistantes 12 Institut Mines-Télécom 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 13 Institut Mines-Télécom Janvier 2014 Traduction du diagramme en dehors de l’arbre d’héritage ■ Modèle entité/association Localisation salle : varchar(20) rayon : varchar(5) Genre nom : varchar(20) nbEmprunts : integer FicheEmprunt dateEmprunt : date dateLimite : date depasse : integer 1,1 correspondre 0,n Client nom : varchar(20) prenom : varchar(20) adresse : varchar(20) nbEmpruntsEffectues : integer nbEmpruntsDepasses : integer 1,1 nbEmpruntsEnCours : integer dateInscription : date codeReduction : integer dateRenouvellement : date 14 Institut Mines-Télécom Categorie nom : varchar(20) nbEmpruntsMax : integer tarifInscription : float coefDuree : float coefTarif : float codeReducUsed : integer 0,n appartenir Janvier 2014 Hypothèse 2 : Traduction du diagramme en dehors de l’arbre d’héritage ■ Modèle relationnel Localisation salle : varchar(20) rayon : varchar(5) Genre nom : varchar(20) nbEmprunts : integer FicheEmprunt dateEmprunt dateLimite depasse nom prenom Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours dateInscription codeReduction dateRenouvellement catclient 15 Institut Mines-Télécom Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed Janvier 2014 Il reste la partie la plus intéressante : l’arbre d’héritage ! Localisation salle : varchar(20) rayon : varchar(5) Genre nom : varchar(20) nbEmprunts : integer FicheEmprunt dateEmprunt dateLimite depasse nom prenom Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours dateInscription codeReduction dateRenouvellement catclient 16 Institut Mines-Télécom Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed Janvier 2014 Revenons sur la sémantique de l’héritage (1) ■ Spécialisation peut être : Personne nom prénom adresse ● Partielle* : une instance peut ne pas être spécialisée Personne Etudiant Salarie Partielle X ● Totale** : toute instance est spécialisée dans au moins une classe enfant Etudiant noEtud cycle Salarie salaire Totale Prive prime Public indice Salarie = Prive Public Dans les cours UML et Java, les termes utilisés sont classes concrètes* et classes abstraites* 17 Institut Mines-Télécom Janvier 2014 Revenons sur la sémantique de l’héritage (2) ■ Spécialisation peut être : Personne nom prénom adresse ● 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 Etudiant Salarié Recouvrement Etudiant noEtud cycle Salarie salaire Partition Doctorant vacataire Prive prime 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++) 18 Institut Mines-Télécom Janvier 2014 Public indice Traduction de l’héritage en modèle relationnel ■ 3 correspondances possibles : 1. Correspondance directe 2. Correspondance ascendante 3. Correspondance par aplatissement 3.1. Pour partition 3.2. Pour recouvrement 19 Institut Mines-Télécom Janvier 2014 Correspondance directe (n° 1) ■ 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é Relation clé Audio code classification Clé + clé étrangère 20 Institut Mines-Télécom Video code dureeFilm mentionLegale Contrainte d’intégrité référentielle Livre code nbPages Janvier 2014 Correspondance directe (n° 1) - suite VueDocument code titre auteur annee empruntable emprunte nbEmprunts Typedoc Classification nombrePages Durrefilm Mentionlegale Audio code classification 21 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 Video code dureeFilm mentionLegale Institut Mines-Télécom Livre code nbPages Relation clé Contrainte d’intégrité référentielle Vue Construction de la vue par requête Janvier 2014 Correspondance directe pour la médiathèque VueDocument code titre … Audio code classification Video code dureeFilm mentionLegale Livre code nbPages Genre nom nbEmprunts 22 Document code titre auteur annee empruntable emprunte nbEmprunts nomGenre salle rayon Localisation salle rayon Institut Mines-Télécom FicheEmprunt nom prenom code dateEmprunt dateLimite depasse Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours catclient dateInscription codeReduction dateRenouvellement Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed Solution retenue pour le TP Janvier 2014 Correspondance directe et typologie des arbres d’héritage Spécialisation 23 Spécialisation Totale Partielle Partition Recouvrement OK Vérification : 1 tuple de la « relation parent » est toujours référencé par 1 tuple de la « relation enfant » OK OK Vérification : nonduplication de clé entre « relations enfants » OK Institut Mines-Télécom Remarques Reconstitution de l'objet par jointure Sémantique très proche du modèle objet Fonctionne pour tout arbre 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 Document code titre auteur annee empruntable emprunte nbEmprunts Audio code titre auteur annee empruntable emprunte nbEmprunts classification 24 Institut Mines-Télécom Video code titre auteur annee empruntable emprunte nbEmprunts dureeFilm mentionLegale 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 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 Document code 25 Audio code FicheEmpruntAudio code nom prenom Video code FicheEmpruntVideo code nom prenom Livre code FicheEmpruntLivre code nom prenom Institut Mines-Télécom Client nom prenom FicheEmprunt Janvier 2014 Correspondance ascendante et typologie des arbres d’héritage Spécialisation Spécialisation Totale Partielle Partition Recouvrement OK KO OK KO Redondance de données Remarques Multiplie les relations Évite les jointures pour reconstruire les objets Spécialisation totale. Classe abstraite = vue (relation virtuelle) Difficile d’assurer l’unicité des identificateurs 26 Institut Mines-Télécom Janvier 2014 Correspondance par aplatissement (n° 3.1) ■ Ensemble des classes de la hiérarchie une seule ■ ■ relation BD Éventuellement chaque classe « enfant » une vue Correspondance de l’arbre de Document Document code titre auteur annee empruntable emprunte nbEmprunts typeDocument classification dureeFilm mentionLegale nbPages Audio code … classification 27 Institut Mines-Télécom Video code … dureeFilm mentionLegale CREATE VIEW Audio AS SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts, classification FROM Document WHERE typeDocument=‘Audio’ Livre code … nbPages Janvier 2014 Correspondance par aplatissement 3.1 pour la médiathèque Genre nom nbEmprunts Localisation salle rayon Document code titre auteur annee empruntable emprunte nbEmprunts nomGenre salle rayon typeDocument classification dureeFilm mentionLegale nbPages FicheEmprunt nom prenom code dateEmprunt dateLimite depasse Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours typeClient dateInscription dateRenouvellement codeReduction dateCotisation Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed Solution retenue pour le TP 28 Institut Mines-Télécom Janvier 2014 Correspondance par aplatissement 3.1 et typologie des arbres d’héritage Spécialisation Spécialisation Totale Partielle Partition Recouvrement OK OK Si attribut donnant le nom de la classe autorisé à null OK KO Remarques Évite les jointures pour reconstruire les objets Du vide dans la relation (valeurs nulles) Spécialisation totale : classes abstraites relations (concrètes), classes concrètes vues (virtuelles) Souvent la solution la plus simple à mettre en place; la plus choisie 29 Institut Mines-Télécom 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 30 Institut Mines-Télécom 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 Spécialisation 31 Spécialisation Remarques Totale Partielle Partition Recouvrement OK OK Si tous les attributs booléens correspondant aux classes enfants sont autorisés à FAUX/NULL Non pertinent 3.1 OK Institut Mines-Télécom idem 3.1 Janvier 2014 QCM – Vrai ou faux ■ Y a t-il toujours un modèle relationnel ■ ■ ■ 32 « correspondant » à un diagramme de classes ? Le nombre de relations dans le modèle relationnel est-il égal au nombre de classes dans le diagramme de classes ? Une classe abstraite est-elle 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 ? Institut Mines-Télécom Janvier 2014 Plan du document 1. Motivations 2. Quel schéma de Base de Données Relationnelle ? 3. Gérer la persistance dans Java : JDBC 1. Qu’est ce que JDBC ? 2. Que faire pour pouvoir utiliser JDBC ? 3. Principaux objets mis en œuvre 1. Tuyaux de communication : Connection et Statement 2. Exécution d’une requête : ResultSet 3. Correspondance de type 1. 2. Exemple sur les chaînes de caractères Correspondance de type SQL/Java 4. Étapes d’interaction avec le SGBD 5. Politique de gestion de la persistance 4. Conclusion 33 Institut Mines-Télécom Janvier 2014 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) Application java Pilote − Dépendants des SGBDs cibles − « Tout » SGBD a un pilote JDBC Protocole du SGBD SGBD 34 Institut Mines-Télécom 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" ); 35 Institut Mines-Télécom Janvier 2014 Tuyaux de communication : Classe Connection et Statement Media : Mediatheque Nom : string …. Connection : @Connection Constructeur() rechercheBD() miseAJourBD() Destructeur() 36 Pilote PostgreSQL Application java Institut Mines-Télécom Statement statement1 « SELECT * FROM Document » Statement statement2 SGBD PostgresSQL Statement statement3 Janvier 2014 Exécution d’une requête : Classe ResultSet Application java Nom : string …. lesLocalisations: collection de @Localisation 37 Pilote MySQL media : Mediatheque Institut Mines-Télécom Statement stmt1 ResultSet rset = stmt1.executeQuery ("select * from localisation"); SGBD PostgresSQL Localisation Janvier 2014 Correspondance de types : Exemple sur les chaînes de caractères Application java Statement stmt1 rset contient "select * from localisation"; while (rset.next()) { … String salle = rset.getString("salle"); … } String salle 38 Institut Mines-Télécom SGBD PostgresSQL Localisation salle : varchar(20) Janvier 2014 Correspondance de type SQL/Java (1) Type SQL numeric integer float char, varchar date 39 Institut Mines-Télécom Méthode recommandée Java.Math.BigDecimal getBigDecimal() int getInt() double getDouble() String getString() java.sql.Date getDate() java.util.Date 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 ResultSet rset = stmt.executeQuery("select * from document"); while (rset.next()) { … boolean empruntable = rset.getInt("empruntable") > 0; boolean emprunte = rset.getInt("emprunte") > 0; … } 40 Institut Mines-Télécom Janvier 2014 Étapes d’interaction avec le SGBD 1. Ouvrir une connexion ● Instance de Connection 2. 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 (?, ?) 3. Demander l’exécution de ces instructions par le SGBD : ● Requête d’interrogation (SELECT) : méthode executeQuery() sur le *Statement ● Requête de mise à jour (INSERT, UPDATE, DELETE) : méthode executeUpdate() sur le *Statement 4. Fermer la connexion : méthode close() sur la connexion 41 Institut Mines-Télécom 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); } Institut Mines-Télécom 2012 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 } 43 Institut Mines-Télécom 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 " + e); } } 44 Institut Mines-Télécom BD- Janvier 2014 QCM - Vrai/faux ■ Puis-je me passer de « driver » pour interagir avec le ■ ■ ■ ■ ■ 45 SGBD ? Dois-je créer une connexion (objet Connection) à chaque fois que je dois interagir avec le SGBD et la refermer après chaque interaction ? Faut –il, en fonction du type de requête SQL à exécuter, choisir judicieusement la méthode execute* à utiliser Un ResultSet peut-il contenir de nombreux « tuples » ? Les types Java et les types de bases de données correspondent-ils parfaitement ? La méthode prepareStatement est-elle utilisée pour les requêtes paramétrées ? Institut Mines-Télécom 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 ? 46 Institut Mines-Télécom 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 47 Institut Mines-Télécom Janvier 2014 Chargement / déchargement (2) ■ Statique ● Adapté aux petits volumes de données ● Faible taux de mises à jour ● Simple à mettre en œuvre ■ Dynamique ● ● ● ● 48 Adapté aux volumes de données importants Fort taux de mises à jour Meilleure résistance aux fautes Plus compliqué à programmer Institut Mines-Télécom Janvier 2014 Plan du document 1. Motivations 2. 3. 4. 49 1. Application exemple : la médiathèque 2. Problématique en image Quel schéma de Base de Données Relationnelle ? Gérer la persistance dans Java : JDBC Conclusion Institut Mines-Télécom Janvier 2014 Conclusion ■ Pour un 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 50 Institut Mines-Télécom Janvier 2014