16 Base de donnes objet 11022022 Robert Godin
16 Base de données objet 11/02/2022 © Robert Godin. Tous droits réservés. 1
Introduction n n Persistance transparente dans un langage objet Pas de défaut d’impédance – n Navigation rapide vs jointure – – n – – – n stockage en grappe accès par pointeur Quelques niches – n pas de transformation entre modèles ingénierie, télécom, applications scientifiques, Web 2, … graphe d’objets complexe temps réel BD enchâssée Norme ODMG Portail : http: //www. odbms. org/ 11/02/2022 © Robert Godin. Tous droits réservés. 2
16. 1 Le langage de définition de données ODL Basé sur IDL (CORBA/OMG) n Non supporté n – – n association n-aire n>2 classe associative Types littéraux (valeurs)/objets 11/02/2022 © Robert Godin. Tous droits réservés. 3
Exemple UML 11/02/2022 © Robert Godin. Tous droits réservés. 4
16. 1. 1 Classe et interface ODL 11/02/2022 © Robert Godin. Tous droits réservés. 5
16. 1. 1. 1 INTERFACE ODL Pas d ’extent (non instantiable) n Attribut/association n – – 11/02/2022 équivalent lecteur/modifieur non hérité par interface © Robert Godin. Tous droits réservés. 6
16. 1. 2 Héritage d'interface (: ) et de classe (extends) 11/02/2022 © Robert Godin. Tous droits réservés. 7
16. 1. 3 Littéral ODL 11/02/2022 © Robert Godin. Tous droits réservés. 8
Littéral structuré 11/02/2022 © Robert Godin. Tous droits réservés. 9
16. 1. 4 Collections ODL 11/02/2022 © Robert Godin. Tous droits réservés. 10
16. 1. 5 Association en ODL (relationship) 11/02/2022 © Robert Godin. Tous droits réservés. 11
16. 1. 6 Spécification de la signature des opérations 11/02/2022 © Robert Godin. Tous droits réservés. 12
16. 2 Objets transients/persistants Cohabitation des objets transiants/persistants pour une même classe n Persistance par atteignabilité (par référence) n 11/02/2022 © Robert Godin. Tous droits réservés. 13
16. 2. 1 Constructeurs d'objets 11/02/2022 © Robert Godin. Tous droits réservés. 14
16. 2. 2 Contrôle de concurrence n Pessimiste par défaut – – verrouillage en deux phases mode read (partagé) en lecture mode write (exclusif) en écriture mode upgrade n demande 11/02/2022 explicite par lock() ou try-lock() © Robert Godin. Tous droits réservés. 15
16. 2. 3 Noms de racines persistantes n bind() pour créer un nom de racine persistante – n persistance par atteignabilité (reachability) – – n extent est une racine persistante objets qui sont référencés par une racine deviennent persistants au commit lookup() pour cher la racine 11/02/2022 © Robert Godin. Tous droits réservés. 16
Autres approches de contrôle de la persistance n Contrôle programmatique explicite – n objet. make. Persistent() Par héritage – 11/02/2022 sous-classes d ’une classe spéciale © Robert Godin. Tous droits réservés. 17
16. 2. 4 Gestion des OID persistants n Table OID -> adresse transiante – n coût important de traduction Mutation de pointeurs (pointer swizzling) – – bit qui distingue entre OID et adresse transiante quand muter ? n Automatique : au chargement n À la demande : au premier parcours n Mécanisme de mémoire virtuelle (hardware) 11/02/2022 – Object Store © Robert Godin. Tous droits réservés. 18
16. 3 Le langage de requête OQL n Similarités avec SQL – n table -> racine persistente Grammaire complète : – 11/02/2022 http: //www. odmg. org © Robert Godin. Tous droits réservés. 19
16. 3. 1 SELECT de base n Le titre des livres parus après 1999 11/02/2022 © Robert Godin. Tous droits réservés. 20
16. 3. 2 Clause DISTINCT n Le titre et l'année des livres parus après 1999 sans doublons 11/02/2022 © Robert Godin. Tous droits réservés. 21
16. 3. 3 Constructeur STRUCT n Le titre et l'année. Parution des livres parus après 1999 n Équivalent à 11/02/2022 © Robert Godin. Tous droits réservés. 22
16. 3. 4 Sélection d'objets de la BD n Collection de références aux objets de la classe Livre parus après 1999 n Peut ensuite manipuler les objets persistants 11/02/2022 © Robert Godin. Tous droits réservés. 23
16. 3. 5 Requête sans SELECT n Collection des livres 11/02/2022 © Robert Godin. Tous droits réservés. 24
16. 3. 6 Expressions de chemins n Le titre de l ’objet un. Livre (type Livre) n Exemple avec une opération 11/02/2022 © Robert Godin. Tous droits réservés. 25
Expressions de chemins (suite) n Naviguer une association n En cascade 11/02/2022 © Robert Godin. Tous droits réservés. 26
Navigation à travers une collection n Les id. Exemplaires d'un livre n Les id. Exemplaire des livres de l'année 2000 11/02/2022 © Robert Godin. Tous droits réservés. 27
Navigation à travers une collection (suite) n Le ISBN des livres actuellement empruntés par le membre dont le id. Utilisateur = ‘un. Id’ 11/02/2022 © Robert Godin. Tous droits réservés. 28
16. 3. 7 SELECT enchâssé dans le FROM n les id. Exemplaire des livres de l'an 2000 11/02/2022 © Robert Godin. Tous droits réservés. 29
16. 3. 8 SELECT enchâssé dans la spécification du résultat d'un SELECT n Les ISBN des livres de l'an 2000 accompagnés de leurs exemplaires empruntés 11/02/2022 © Robert Godin. Tous droits réservés. 30
16. 3. 9 Aplatissement d'une collection de collections (FLATTEN) n FLATTEN(set ( set(1, 3), set (2, 5, 3), set (5, 8)) ) = set(1, 2, 3, 5, 8) n Extraire les exemplaires des livres parus en l'an 2000 11/02/2022 © Robert Godin. Tous droits réservés. 31
16. 3. 10 Extraction de l'élément d'un singleton (ELEMENT) n Retourner l’objet de la classe Livre qui correspond au ISBN = ‘ 111 -11’ 11/02/2022 © Robert Godin. Tous droits réservés. 32
16. 3. 11 Constructeurs d'objets n Le constructeur suivant construit un objet de la classe Exemplaire 11/02/2022 © Robert Godin. Tous droits réservés. 33
16. 3. 12 Comparaison par identité ou par valeur n Le = compare les OID des objets 11/02/2022 © Robert Godin. Tous droits réservés. 34
16. 3. 13 Quantificateurs FOR ALL et EXISTS n Les livres dont tous les exemplaires sont empruntés n Les livres dont au moins un exemplaire est emprunté 11/02/2022 © Robert Godin. Tous droits réservés. 35
16. 3. 14 Quantificateurs SOME, ANY et ALL 11/02/2022 © Robert Godin. Tous droits réservés. 36
16. 3. 15 Fonctions de groupe n Le nombre moyen d’exemplaires disponibles par livre 11/02/2022 © Robert Godin. Tous droits réservés. 37
16. 3. 16 Partition avec GROUP BY n Le nombre d’exemplaires disponibles par années de parution pour les années où le nombre dépasse 100 11/02/2022 © Robert Godin. Tous droits réservés. 38
16. 3. 18 Tri avec ORDER BY n Les livres triés par ordre descendant (DESC) de l’année de parution et par ordre ascendant (ASC) du titre 11/02/2022 © Robert Godin. Tous droits réservés. 39
16. 4. 2. 1 SCÉNARIO GLOBAL DE MANIPULATION DE DONNÉES EN JAVA 11/02/2022 © Robert Godin. Tous droits réservés. 40
16. 4. 2. 2 DÉFINITION DE CLASSES CAPABLES DE PERSISTANCE n Dcollection, Dset, Dbag, Dlist, Darray et Dmap 11/02/2022 © Robert Godin. Tous droits réservés. 41
16. 4. 2. 3 CRÉATION D'UNE RACINE PERSISTANTE 11/02/2022 © Robert Godin. Tous droits réservés. 42
16. 4. 2. 4 NAVIGATION À PARTIR D'UNE RACINE PERSISTANTE 11/02/2022 © Robert Godin. Tous droits réservés. 43
16. 4. 2. 5 REQUÊTE SIMPLE SUR UNE DCOLLECTION 11/02/2022 © Robert Godin. Tous droits réservés. 44
16. 4. 2. 6 REQUÊTE OQL 11/02/2022 © Robert Godin. Tous droits réservés. 45
1. 5 Persistance transparente avec la norme JDO API normalisée pour persistance transparente n Au-dessus de n – n fichiers, BD SQL, XML, etc. SQL – 11/02/2022 correspondance déclarative entre les types d'objets et tables © Robert Godin. Tous droits réservés. 46
Exemple Livre et Editeur 11/02/2022 © Robert Godin. Tous droits réservés. 47
11/02/2022 © Robert Godin. Tous droits réservés. 48
Correspondance table-classe par descripteur XML 11/02/2022 © Robert Godin. Tous droits réservés. 49
Réalisation par modification de code-octet 11/02/2022 © Robert Godin. Tous droits réservés. 50
Création d’objets persistants 11/02/2022 © Robert Godin. Tous droits réservés. 51
Utilisation d’un Extent 11/02/2022 © Robert Godin. Tous droits réservés. 52
JDOQL 11/02/2022 © Robert Godin. Tous droits réservés. 53
Modification 11/02/2022 © Robert Godin. Tous droits réservés. 54
Supression 11/02/2022 © Robert Godin. Tous droits réservés. 55
Hibernate n n n Outil de persistence transparente Java Open source Améliorations vs EJB 2 et JDO 1 – Plain Old Java Objects (POJO) n – – n Héritage, associations par attributs Java Langage de requête HQL plus proche de SQL Pas de manipulation de code (introspection Java) Support de l’API de persistance Java de la nouvelle norme EJB 3 (JSR 220) 11/02/2022 © Robert Godin. Tous droits réservés. 56
Classe Editeur 11/02/2022 © Robert Godin. Tous droits réservés. 57
Classe Livre 11/02/2022 © Robert Godin. Tous droits réservés. 58
Mappage objet-relationnel pour Editeur CREATE TABLE Editeur (nom. Editeur VARCHAR(20) ville VARCHAR(20) PRIMARY KEY (nom. Editeur) ) NOT NULL, <? xml version="1. 0"? > CREATE TABLE Livre<!DOCTYPE hibernate-mapping PUBLIC (ISBN CHAR(13) NOT NULL, "-//Hibernate Mapping DTD//EN" titre VARCHAR(50) NOT NULL, "http: //hibernate. sourceforge. net/hibernate-mapping-3. 0. dtd"> annee. Parution NUMBER(4) NOT NULL, nom. Editeur VARCHAR(20) NOT NULL, <hibernate-mapping> PRIMARY KEY (ISBN), <class FOREIGN KEY (nom. Editeur) REFERENCES Editeur name="pack. Exemple. Hib. Editeur" table="Editeur"> ) <id name="nom. Editeur"/> <property name="ville"/> <set name="les. Livres" inverse="true" cascade = "all"> <key column="nom. Editeur"/> <one-to-many class="pack. Exemple. Hib. Livre"/> </set> </class> 11/02/2022 © Robert Godin. Tous droits réservés. 59 </hibernate-mapping>
Mappage objet-relationnel pour Livre <? xml version="1. 0"? > <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD//EN" "http: //hibernate. sourceforge. net/hibernate-mapping-3. 0. dtd"> <hibernate-mapping> <class name="pack. Exemple. Hib. Livre" table="Livre"> <id name="ISBN"/> <property name="titre"/> <property name="annee. Parution"/> CREATE TABLE Editeur <many-to-one class="pack. Exemple. Hib. Editeur" (nom. Editeur VARCHAR(20) name="editeur" NOT NULL, ville VARCHAR(20) NOT NULL, column="nom. Editeur" not-null="true"/> PRIMARY KEY (nom. Editeur) </class> ) </hibernate-mapping> CREATE TABLE Livre (ISBN CHAR(13) NOT NULL, titre VARCHAR(50) NOT NULL, annee. Parution NUMBER(4) NOT NULL, nom. Editeur VARCHAR(20) NOT NULL, PRIMARY KEY (ISBN), FOREIGN KEY (nom. Editeur) REFERENCES Editeur ) 11/02/2022 © Robert Godin. Tous droits réservés. 60
Singleton qui démarre Hibernate et fournit l'objet Session. Factory public class Hibernate. Util { private static Session. Factory session. Factory; static { try { session. Factory = new Configuration(). configure(). build. Session. Factory(); } catch (Throwable ex) { throw new Exception. Initializer. Error(ex); } } public static Session. Factory get. Session. Factory() { return session. Factory; } public static void shutdown() { // Ferme les antémémoires et les bassins (pool) de connexions get. Session. Factory(). close(); } } 11/02/2022 © Robert Godin. Tous droits réservés. 61
Fichier de configuration hibernate. cfg. xml <? xml version='1. 0' encoding='utf-8'? > <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate Configuration DTD//EN" "http: //hibernate. sourceforge. net/hibernate-configuration-3. 0. dtd"> <hibernate-configuration> <session-factory> <property name="hibernate. connection. driver_class">oracle. jdbc. driver. Oracle. Driver</property> <property name="hibernate. connection. url">jdbc: oracle: thin: @localhost: 1521: ORCL</property> <property name="hibernate. connection. username">godin</property> <property name="hibernate. connection. password">oracle</property> <property name="dialect">org. hibernate. dialect. Oracle 9 Dialect</property> <property name="hibernate. c 3 p 0. min_size">5</property> <property name="hibernate. c 3 p 0. max_size">20</property> <property name="hibernate. c 3 p 0. timeout">300</property> <property name="hibernate. c 3 p 0. max_statements">50</property> <property name="hibernate. c 3 p 0. idle_test_period">3000</property> <!-- SQL to stdout logging --> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="use_sql_comments">true</property> <mapping resource="pack. Exemple. Hib/Editeur. hbm. xml"/> <mapping resource="pack. Exemple. Hib/Livre. hbm. xml"/> </session-factory> 11/02/2022 © Robert Godin. Tous droits réservés. </hibernate-configuration> 62
Une première session Hibernate qui insère deux éditeurs et deux livres Session une. Session = Hibernate. Util. get. Session. Factory(). open. Session(); Transaction une. Transaction = une. Session. begin. Transaction(); Editeur un. Editeur = new Editeur("Loze-Dion", "Longueuil"); Editeur un. Autre. Editeur = new Editeur("Addison-Wesley", "Reading, MA"); Livre un. Livre = new Livre("1 -1111", "SGBD", 2000, un. Editeur); un. Editeur. get. Les. Livres(). add(un. Livre); Livre un. Autre. Livre = new Livre("2 -2222", "le titre", 1999, un. Editeur); un. Editeur. get. Les. Livres(). add(un. Autre. Livre); une. Session. save(un. Editeur); une. Session. save(un. Autre. Editeur); une. Transaction. commit(); une. Session. close(); Persistance par référence des livres associés (voir attribut cascade dans fichier de mappage Editeur. hbm. xml) 11/02/2022 © Robert Godin. Tous droits réservés. 63
Une deuxième session Hibernate qui lit les données de la première session et les affiche une. Session = Hibernate. Util. get. Session. Factory(). open. Session(); une. Transaction = une. Session. begin. Transaction(); List les. Editeurs = une. Session. create. Query("from Editeur e order by e. nom. Editeur asc"). list(); System. out. println( les. Editeurs. size() + " editeurs trouves: " ); for ( Iterator iter. Editeurs = les. Editeurs. iterator(); iter. Editeurs. has. Next(); ) { Editeur un. Editeur. Charge = (Editeur) iter. Editeurs. next(); System. out. println("Editeur: "+ un. Editeur. Charge. get. Nom. Editeur() ); System. out. println("Livres de l'editeur: " ); for ( Iterator iter. Livres = un. Editeur. Charge. get. Les. Livres(). iterator(); iter. Livres. has. Next(); ) { Livre un. Livre. Charge = (Livre) iter. Livres. next(); System. out. println(" "+un. Livre. Charge. get. Titre() ); } } une. Transaction. commit(); une. Session. close(); 11/02/2022 © Robert Godin. Tous droits réservés. 64
Une troisième session Hibernate qui extrait les éditeurs de Paris ou Longueuil une. Session. create. Query ("from Editeur e where e. ville = 'Paris' or e. ville = 'Longueuil' order by e. nom. Editeur asc"). list(); 11/02/2022 © Robert Godin. Tous droits réservés. 65
Une quatrième session Hibernate qui modifie le titre de ISBN: 1 -1111 une. Transaction = une. Session. begin. Transaction(); List les. Livres = une. Session. create. Query("from Livre l where l. ISBN = '1 -1111' "). list(); un. Livre = (Livre)les. Livres. iterator(). next(); un. Livre. set. Titre("Un. Nouveau. Titre"); une. Transaction. commit(); 11/02/2022 © Robert Godin. Tous droits réservés. 66
Une cinquième session Hibernate qui supprime un livre une. Transaction = une. Session. begin. Transaction(); les. Livres = une. Session. create. Query("from Livre l where l. ISBN = '1 -1111' "). list(); un. Livre = (Livre)les. Livres. iterator(). next(); une. Session. delete(un. Livre); une. Transaction. commit(); 11/02/2022 © Robert Godin. Tous droits réservés. 67
Suppression d’un éditeur et des livres associés en cascade (voir attribut cascade dans Editeur. hbm. xml) une. Session. delete(un. Editeur. Charge); 11/02/2022 © Robert Godin. Tous droits réservés. 68
- Slides: 68