Institut Mines-Télécom Gestion de la persistance des objets CSC4002 Claire Lecocq Janvier 2014
Feb 24, 2016
Institut Mines-Télécom
Gestion de la persistance des objets
CSC4002Claire Lecocq
Janvier 2014
Institut Mines-Télécom
Plan du document
1. Motivations1. Application exemple : la médiathèque2. Problématique en image
2. Quel schéma de Base de Données Relationnelle ?3. Gérer la persistance dans Java : JDBC4. Conclusion
Janvier 20142
Institut Mines-Télécom
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 20143
Institut Mines-Télécom
Problématique en image
Janvier 2014
Stockage des données
Application
Mapping chargement
déchargement
UMLDéveloppement
Objet
Modèle E/ARelationnel
SGBD
4
Institut Mines-Télécom
Plan du document
1. Motivations2. 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 : JDBC4. Conclusion
Janvier 2014
1 la généralisation/spécialisation est appelée dans ce cours héritage
5
Institut Mines-Télécom
Processus de conception d’une BD (rappel)
Janvier 2014
Monde réel
Recueil des besoins et analyse
Besoin de la BD
Conception logique
Schéma conceptuel (haut niveau)
Transformation du modèle
Schéma conceptuel (spécifique SGBD)
Conception physique
Schéma physique (spécifique SGBD)
Indépendant du SGB
DSpécifique à un SG
BD
Prise en compte des particularités du SGBD
Contrat
E/A UML
Placement DisqueOptimisation
RelationnelRéseauHiérarchique
6
Institut Mines-Télécom
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 20147
Institut Mines-Télécom
Hypothèse 1 : Correspondance E/A diagramme de classes
SI-BDEntité/Association
Génie logiciel - langagesDiagramme 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é Attribut dérivé Opération
Cardinalités Multiplicités
Attribut d’une entité de paramètres
Attributs de classe
8 Janvier 2014
Institut Mines-Télécom
Hypothèse 1 : Correspondance E/A diagramme de classes
SI-BDEntité/Association
Génie logiciel - langagesDiagramme 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é Attribut dérivé Opération
Cardinalités Multiplicités
Attribut d’une entité de paramètres
Attributs de classe
9 Janvier 2014
Problèmehéritage
Institut Mines-Télécom
Diagramme de classes de la médiathèque
Janvier 201410
Institut Mines-Télécom
Traduction du diagramme en dehors de l’arbre d’héritage
■Classe façade
11 Janvier 2014
Institut Mines-Télécom
Traduction du diagramme en dehors de l’arbre d’héritage
■Classes persistantes
12 Janvier 2014
Institut Mines-Télécom
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 Janvier 2014
Institut Mines-Télécom
Traduction du diagramme en dehors de l’arbre d’héritage
■Modèle entité/association
14 Janvier 2014
Genrenom : varchar(20)nbEmprunts : integer
Localisationsalle : varchar(20)rayon : varchar(5)
Clientnom : varchar(20)prenom : varchar(20)adresse : varchar(20)nbEmpruntsEffectues : integernbEmpruntsDepasses : integernbEmpruntsEnCours : integerdateInscription : datecodeReduction : integerdateRenouvellement : date
Categorienom : varchar(20)nbEmpruntsMax : integertarifInscription : floatcoefDuree : floatcoefTarif : floatcodeReducUsed : integer
FicheEmpruntdateEmprunt : datedateLimite : datedepasse : integer
correspondre
appartenir
1,1
1,1
0,n
0,n
Institut Mines-Télécom
Hypothèse 2 : Traduction du diagramme en dehors de l’arbre d’héritage
■Modèle relationnel
15 Janvier 2014
Genrenom : varchar(20)nbEmprunts : integer
Localisationsalle : varchar(20)rayon : varchar(5)
Clientnom prenom adressenbEmpruntsEffectuesnbEmpruntsDepassesnbEmpruntsEnCours dateInscriptioncodeReductiondateRenouvellementcatclient
CategorienomnbEmpruntsMaxtarifInscriptioncoefDureecoefTarif codeReducUsed
FicheEmpruntdateEmprunt dateLimitedepassenomprenom
Institut Mines-Télécom
Il reste la partie la plus intéressante : l’arbre d’héritage !
16 Janvier 2014
Genrenom : varchar(20)nbEmprunts : integer
Localisationsalle : varchar(20)rayon : varchar(5)
Clientnom prenom adressenbEmpruntsEffectuesnbEmpruntsDepassesnbEmpruntsEnCours dateInscriptioncodeReductiondateRenouvellementcatclient
CategorienomnbEmpruntsMaxtarifInscriptioncoefDureecoefTarif codeReducUsed
FicheEmpruntdateEmprunt dateLimitedepassenomprenom
Institut Mines-Télécom
Revenons sur la sémantique de l’héritage (1)
■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
Janvier 2014
Personnenomprénomadresse
Partielle
Personne Etudiant Salarie
Totale
Salarie = Prive Public
EtudiantnoEtudcycle
Salariesalaire
Publicindice
Priveprime
X
17
Dans les cours UML et Java, les termes utilisés sont classes concrètes* et classes abstraites*
Institut Mines-Télécom
Revenons sur la sémantique de l’héritage (2)
■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
Janvier 2014
Personnenomprénomadresse
Recouvrement
Etudiant Salarié
Partition
Prive Public =
EtudiantnoEtudcycle
Salariesalaire
Publicindice
PriveprimeDoctorant
vacataire
18
• 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++)
Institut Mines-Télécom
Traduction de l’héritage en modèle relationnel
■ 3 correspondances possibles :1. Correspondance directe2. Correspondance ascendante3. Correspondance par aplatissement
3.1. Pour partition3.2. Pour recouvrement
Janvier 201419
Institut Mines-Télécom
Correspondance directe (n° 1)
■Une classe une relation BD■Liaison entre les relations se fait via la clé■Correspondance de l’arbre de Document
Janvier 2014
DocumentcodetitreauteuranneeempruntableempruntenbEmprunts
Audiocodeclassification
VideocodedureeFilmmentionLegale
LivrecodenbPages
Créationd’une clé
Clé + clé étrangère
Relationclé
Contrainte d’intégritéréférentielle
20
Institut Mines-Télécom
Correspondance directe (n° 1) - suite
Janvier 2014
DocumentcodetitreauteuranneeempruntableempruntenbEmprunts
Audiocodeclassification
VideocodedureeFilmmentionLegale
LivrecodenbPages
Relationclé
Contrainte d’intégritéréférentielle
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 ;
VueDocumentcodetitreauteuranneeempruntableempruntenbEmpruntsTypedocClassificationnombrePagesDurrefilmMentionlegale
Vue
Construction de la vue par requête
21
Institut Mines-Télécom
Correspondance directe pour la médiathèque
Janvier 2014
DocumentcodetitreauteuranneeempruntableempruntenbEmpruntsnomGenresallerayon
Audiocodeclassification
VideocodedureeFilmmentionLegale
LivrecodenbPages
GenrenomnbEmprunts
Localisationsallerayon
Clientnomprenom adresse nbEmpruntsEffectuesnbEmpruntsDepasses
nbEmpruntsEnCours catclient dateInscription codeReduction dateRenouvellement
CategorienomnbEmpruntsMaxtarifInscriptioncoefDureecoefTarifcodeReducUsed
FicheEmpruntnomprenomcode dateEmprunt dateLimite
depasse
Solution retenue pour le TP
VueDocumentcodetitre…
22
Institut Mines-Télécom
Correspondance directe et typologie des arbres d’héritage
Spécialisation Spécialisation Remarques
Totale Partielle Partition Recouvrement
OKVérification : 1
tuple de la « relation
parent » est toujours
référencé par 1 tuple de la « relation enfant »
OK OKVérification : non-duplication de clé entre « relations enfants »
OK Reconstitution de l'objet par jointure
Sémantique très proche du modèle objet
Fonctionne pour tout arbre d’héritage
Janvier 201423
Institut Mines-Télécom
Correspondance ascendante (n° 2)■Chaque classe spécialisée une relation BD■Classe parent une vue■Correspondance de l’arbre de Document
Janvier 2014
CREATE VIEW Document AS SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts FROM AudioUNION SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts FROM VideoUNION SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts FROM Livre
DocumentcodetitreauteuranneeempruntableempruntenbEmprunts
AudiocodetitreauteuranneeempruntableempruntenbEmpruntsclassification
VideocodetitreauteuranneeempruntableempruntenbEmpruntsdureeFilmmentionLegale
LivrecodetitreauteuranneeempruntableempruntenbEmpruntsnbPages
Vue
Construction de la vue par requête
24
Institut Mines-Télécom
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
Janvier 2014
Audiocode
Videocode
Livrecode
Documentcode
FicheEmpruntAudiocodenomprenom
Clientnomprenom
FicheEmpruntVideocodenomprenom
FicheEmpruntLivrecodenomprenom
FicheEmprunt
25
Institut Mines-Télécom
Correspondance ascendante et typologie des arbres d’héritage
Janvier 2014
Spécialisation Spécialisation Remarques
Totale Partielle Partition Recouvrement
OK KO OK KORedondance de données
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
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
Janvier 2014
CREATE VIEW Audio ASSELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts, classificationFROM DocumentWHERE typeDocument=‘Audio’
DocumentcodetitreauteuranneeempruntableempruntenbEmpruntstypeDocumentclassificationdureeFilmmentionLegalenbPages
Audiocode…classification
Videocode…dureeFilmmentionLegale
Livrecode…nbPages
27
Institut Mines-Télécom
Correspondance par aplatissement 3.1 pour la médiathèque
Janvier 2014
DocumentcodetitreauteuranneeempruntableempruntenbEmpruntsnomGenresallerayontypeDocumentclassificationdureeFilmmentionLegalenbPages
GenrenomnbEmprunts
Localisationsallerayon
Clientnomprenom adresse nbEmpruntsEffectuesnbEmpruntsDepassesnbEmpruntsEnCourstypeClientdateInscriptiondateRenouvellementcodeReduction
dateCotisation
FicheEmpruntnomprenom code dateEmprunt dateLimite
depasse
Solution retenue pour le TP
CategorienomnbEmpruntsMaxtarifInscriptioncoefDureecoefTarifcodeReducUsed
28
Institut Mines-Télécom
Correspondance par aplatissement 3.1 et typologie des arbres d’héritage
Spécialisation Spécialisation Remarques
Totale Partielle Partition Recouvrement
OK OKSi attribut donnant le nom de la
classe autorisé à
null
OK KO É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 Janvier 2014
Institut Mines-Télécom
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
Janvier 2014
CREATE VIEW Audio ASSELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts, classificationFROM DocumentWHERE AudioB = 1
DocumentcodetitreauteuranneeempruntableempruntenbEmpruntsAudioBVideoBLivreBClassificationdureeFilmmentionLegalenbPages
30
Institut Mines-Télécom
Correspondance par aplatissement 3.2 et typologie des arbres d’héritage
Spécialisation Spécialisation Remarques
Totale Partielle Partition Recouvrement
OK OKSi tous les attributs booléens
correspondant aux classes enfants sont autorisés à FAUX/NULL
Non pertinent3.1
OK idem 3.1
Janvier 201431
Institut Mines-Télécom
QCM – Vrai ou faux
■Y a t-il toujours un modèle relationnel « 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 ?
Janvier 201432
Institut Mines-Télécom
Plan du document
1. Motivations2. 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 Statement2. Exécution d’une requête : ResultSet3. Correspondance de type
1. Exemple sur les chaînes de caractères2. Correspondance de type SQL/Java
4. Étapes d’interaction avec le SGBD5. Politique de gestion de la persistance
4. ConclusionJanvier 201433
Institut Mines-Télécom
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
34 Janvier 2014
SGBD
Application javaPilote
Protocole du SGBD
Institut Mines-Télécom
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.sqlimport 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 201435
Institut Mines-Télécom
Tuyaux de communication : Classe Connection et Statement
Janvier 2014
Application java
Pilo
te P
ostg
reS
QL
SGBDPostgresSQL
Statement statement1 « SELECT * FROM Document »
Statement statement2
Statement statement3
Media : Mediatheque
Nom : string….Connection : @Connection
Constructeur()rechercheBD()miseAJourBD()Destructeur()
36
Institut Mines-Télécom
Exécution d’une requête :Classe ResultSet
Janvier 2014
Application java
Pilo
te M
ySQ
L SGBDPostgresSQL
Localisation
Statement stmt1
ResultSet rset = stmt1.executeQuery ("select * from localisation");
media : Mediatheque
Nom : string….lesLocalisations: collection de @Localisation
37
Institut Mines-Télécom
Correspondance de types : Exemple sur les chaînes de caractères
Janvier 2014
Application java
String salle
SGBDPostgresSQL
Localisation
salle : varchar(20)
Statement stmt1 rset contient "select * from localisation";
while (rset.next()) { … String salle = rset.getString("salle"); …}
38
Institut Mines-Télécom
Correspondance de type SQL/Java (1)
Type SQL Méthode recommandée numeric Java.Math.BigDecimal getBigDecimal() integer int getInt() float double getDouble() char, varchar String getString() date java.sql.Date getDate() java.util.Date
Janvier 201439
Institut Mines-Télécom
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;…
}Janvier 201440
Institut Mines-Télécom
É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 PreparedStatementINSERT 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 connexion41 Janvier 2014
Institut Mines-Télécom
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
Institut Mines-Télécom
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 201443
Institut Mines-Télécom
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 201444
Institut Mines-Télécom
QCM - Vrai/faux
■Puis-je me passer de « driver » pour interagir avec le 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 ?
Janvier 201445
Institut Mines-Télécom
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 201446
Institut Mines-Télécom
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 201447
Institut Mines-Télécom
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 201448
Institut Mines-Télécom
Plan du document
1. Motivations1. Application exemple : la médiathèque2. Problématique en image
2. Quel schéma de Base de Données Relationnelle ?3. Gérer la persistance dans Java : JDBC4. Conclusion
Janvier 201449
Institut Mines-Télécom
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
Janvier 201450