Institut Mines-Télécom
Gestion de la
persistance des objets
CSC4002
Claire Lecocq
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
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 2014 3Problématique en image
Stockage des données
Application
Mapping
chargement
déchargement
UML
Développement
Objet
Modèle E/A
Relationnel
SGBD
Institut Mines-Télécom
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éritage
1−
Traduction de l’héritage en modèle relationnel
3.
Gérer la persistance dans Java : JDBC
4.
Conclusion
Janvier 2014
1 la généralisation/spécialisation est appelée dans ce cours héritage
Processus de conception d’une BD
(rappel)
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é
penda
nt
du
SG
BD
Spéci
fique
à
un
SG
BD
Prise en compte
des
particularités du
SGBD
Contrat E/A UML Placement Disque Optimisation Relationnel Réseau HiérarchiqueInstitut 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 2014 7
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é
Attribut dérivé
Opération
Cardinalités
Multiplicités
Attribut d’une entité de
paramètres
Institut Mines-Télécom
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é
Attribut dérivé
Opération
Cardinalités
Multiplicités
Attribut d’une entité de
paramètres
Attributs de classe
9 Janvier 2014
Problème
héritage
Institut Mines-Télécom
Traduction du diagramme en dehors de
l’arbre d’héritage
■
Classe façade
Traduction du diagramme en dehors de
l’arbre d’héritage
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
Traduction du diagramme en dehors de
l’arbre d’héritage
■
Modèle entité/association
Genre nom : varchar(20) nbEmprunts : integer Localisation salle : varchar(20) rayon : varchar(5) Client nom : varchar(20) prenom : varchar(20) adresse : varchar(20) nbEmpruntsEffectues : integer nbEmpruntsDepasses : integer nbEmpruntsEnCours : integer dateInscription : date codeReduction : integer dateRenouvellement : date Categorie nom : varchar(20) nbEmpruntsMax : integer tarifInscription : float coefDuree : float coefTarif : float codeReducUsed : integer FicheEmprunt dateEmprunt : date dateLimite : date depasse : integer correspondre appartenir 1,1 1,1 0,n 0,nInstitut Mines-Télécom
Hypothèse 2 : Traduction du diagramme
en dehors de l’arbre d’héritage
■
Modèle relationnel
15 Janvier 2014 Genre nom : varchar(20) nbEmprunts : integer Localisation salle : varchar(20) rayon : varchar(5) Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours dateInscription codeReduction dateRenouvellement catclient Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed FicheEmprunt dateEmprunt dateLimite depasse nom prenomIl reste la partie la plus intéressante :
l’arbre d’héritage !
Genre nom : varchar(20) nbEmprunts : integer Localisation salle : varchar(20) rayon : varchar(5) Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours dateInscription codeReduction dateRenouvellement catclient Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed FicheEmprunt dateEmprunt dateLimite depasse nom prenomInstitut 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
Personne
nom
prénom
adresse
Partielle
Personne
Etudiant
Salarie
Totale
Salarie = Prive
Public
Etudiant
noEtud
cycle
Salarie
salaire
Public
indice
Prive
prime
X
17Revenons 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
Personne
nom
prénom
adresse
Recouvrement
Etudiant
Salarié
Partition
Prive
Public =
Etudiant
noEtud
cycle
Salarie
salaire
Public
indice
Prive
prime
Doctorant
vacataire
•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 directe
2.
Correspondance ascendante
3.
Correspondance par aplatissement
3.1.
Pour partition
3.2.
Pour recouvrement
Janvier 2014 19
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 Audio code classification Video code dureeFilm mentionLegale Livre code nbPages
Création
d’une clé
Clé +
clé étrangère
Relation clé Contrainte d’intégrité référentielleInstitut Mines-Télécom
Correspondance directe (n° 1) - suite
Janvier 2014 Document code titre auteur annee empruntable emprunte nbEmprunts Audio code classification Video code dureeFilm mentionLegale Livre code nbPages Relation clé 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 ; VueDocument code titre auteur annee empruntable emprunte nbEmprunts Typedoc Classification nombrePages Durrefilm Mentionlegale Vue Construction de la vue par requête 21
Correspondance directe pour la
médiathèque
Document code titre auteur annee empruntable emprunte nbEmprunts nomGenre salle rayon Audio code classification Video code dureeFilm mentionLegale Livre code nbPages Genre nom nbEmprunts Localisation salle rayon Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCourscatclient dateInscription codeReduction dateRenouvellement Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed FicheEmprunt nom prenom code dateEmprunt dateLimite depasse
Solution retenue pour le TP
VueDocumentcode titre …
Institut Mines-Télécom
Correspondance directe et typologie des
arbres d’héritage
Spécialisation
Spécialisation
Remarques
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 :
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 2014 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
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 Audio code Video code Livre code Document code FicheEmpruntAudio code nom prenom Client nom prenom FicheEmpruntVideo code nom prenom FicheEmpruntLivre code nom prenom FicheEmprunt 25
Correspondance ascendante et typologie
des arbres d’héritage
Spécialisation
Spécialisation
Remarques
Totale
Partielle
Partition
Recouvrement
OK
KO
OK
KO
Redondance
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
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 AS
SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts, classification FROM Document WHERE typeDocument=‘Audio’ Document code titre auteur annee empruntable emprunte nbEmprunts typeDocument classification dureeFilm mentionLegale nbPages Audio code … classification Video code … dureeFilm mentionLegale Livre code … nbPages 27
Correspondance par aplatissement 3.1
pour la médiathèque
Document code titre auteur annee empruntable emprunte nbEmprunts nomGenre salle rayon typeDocument classification dureeFilm mentionLegale nbPages Genre nom nbEmprunts Localisation salle rayon Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours typeClient dateInscription dateRenouvellement codeReduction dateCotisationFicheEmprunt nom prenom code dateEmprunt dateLimite depasse
Solution retenue pour le TP
Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsedInstitut 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
OK
Si 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
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
CREATE VIEW Audio AS
SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts, classification FROM Document WHERE AudioB = 1 Document code titre auteur annee empruntable emprunte nbEmprunts AudioB VideoB LivreB Classification dureeFilm mentionLegale nbPages
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
OK
Si tous les
attributs
booléens
correspondant
aux classes
enfants sont
autorisés à
FAUX/NULL
Non pertinent
3.1
OK
idem 3.1
Janvier 2014 31QCM – 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
?
Institut Mines-Télécom
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.
Exemple sur les chaînes de caractères
2.
Correspondance de type SQL/Java
4.
Étapes d’interaction avec le SGBD
5.
Politique de gestion de la persistance
4.
Conclusion
Janvier 2014 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
SGBD
Application java
Pilote
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.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 35Tuyaux de communication :
Classe Connection et Statement
Application java
Pil
ote
Po
stgre
SQL
SGBD
PostgresSQL
Statement statement1
« SELECT * FROM Document »
Statement statement2
Statement statement3
Media : Mediatheque
Nom : string
….
Connection : @Connection
Constructeur()
rechercheBD()
miseAJourBD()
Destructeur()
Institut Mines-Télécom
Exécution d’une requête :
Classe ResultSet
Janvier 2014Application java
Pil
ote
My
SQL
SGBD
PostgresSQL
Localisation
Statement stmt1
ResultSet rset =
stmt1.executeQuery
("select * from
localisation");
media : Mediatheque
Nom : string
….
lesLocalisations: collection
de @Localisation
37Correspondance de types :
Exemple sur les chaînes de caractères
Application java
String salle
SGBD
PostgresSQL
Localisation
salle :
varchar(20)
Statement stmt1
rset contient
"select * from localisation";
while (rset.next()) {
…
String salle =
rset.getString("salle");
…
}
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 2014 39
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;
…
}
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
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
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
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 2014 43
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);
}
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 2014 45
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 ?
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 2014 47
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
Institut Mines-Télécom
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
Janvier 2014 49