2006 - BDA Persistance - Cours

Embed Size (px)

Citation preview

Les 2 parties du cours Introduction au cours sur la persistance des objetsUniversit de Nice Sophia-AntipolisVersion 0.9 16/9/06

Ce cours se divise en 2 parties : n persistance des objets n bases de donnes avances Ce support est une introduction la premire partie

Richard Grin

Richard Grin

Objet-relationnel

page 2

On part des objetsLe cours de L3 a montr comment concevoir la structure dune base de donnes en partant dune analyse/conception de type entitassociation (E-A) Le point de vue de ce cours est diffrent : on part dune application objet et on veut rendre certaines donnes de lapplication persistantes La structure de la base de donnes devra donc correspondre au modle objet de lapplicationRichard Grin Objet-relationnel page 3

Le dcorUne application complexe multi-tiers Le cours sintresse linterface entre le tiers mtier et le tiers base de donnes Lnorme majorit des base de donnes sont relationnelles et de nombreuses applications modernes sont crites avec des langages objet Comment une application crite dans un langage objet peut effectuer la persistance de ses objets dans une base de donnes relationnelleRichard Grin Objet-relationnel page 4

Persistance des objetsA la fin dune session dutilisation dune application toutes les donnes des objets existant dans la mmoire vive de lordinateur sont perdues Rendre persistant un objet cest sauvegarder ses donnes sur un support non volatile de telle sorte quun objet identique cet objet pourra tre recr lors dune session ultrieureRichard Grin Objet-relationnel page 5

Pourquoi les BD relationnelles ?Position dominante Grande facilit et efficacit pour effectuer des recherches complexes dans des grandes bases de donnes Facilit dadaptation des besoins diffrents (applications avec des vues diffrentes des donnes) Facilit pour spcifier des contraintes dintgrit sans programmation Une thorie solide et des normes reconnuesRichard Grin Objet-relationnel page 6

1

Pourquoi pas un SGBD Objet ?Principale raison : de trs nombreuses bases relationnelles en fonctionnement Les SGBD objet noffre pas la capacit dadaptation la charge des SGBD relationnels Moins de souplesse pour sadapter aux besoins dapplications diffrentes Manque de normalisation pour les SGBDO ; trop de solutions propritaires Peu d'informaticiens forms aux SGBDO (consquence des autres raisons)Richard Grin Objet-relationnel page 7

Objet -> relationnel pas toujours possibleUne partie des donnes peut tre contenue dans une base de donnes prexistante Ces donnes sont dj utilises par dautres applications et leur structure ne peut donc tre modifie Il nest donc pas toujours possible de suivre une dmarche objet vers relationnel

Richard Grin

Objet-relationnel

page 8

Lobjet et le relationnel sont 2 paradigmes bien diffrentsFaire la correspondance entre les donnes modlises par un modle objet et par un modle relationnel nest pas simple Le modle relationnel est moins riche que le modle objet Par exemple, pas dhritage, ni de rfrences, ni de collections (pas dattributs multi-valus) dans le modle relationnelRichard Grin Objet-relationnel page 9

Plan de cette partie du coursLAPI de base pour la persistance en Java (JDBC) - 1 TP Correspondance objet-relationnel - 1 TP Organisation dune application objet pour lutilisation dune BD relationnelle Patterns pour la persistance (DAO,) 1 TP Bases de donnes Relationnelles-Objet (RO) - 1 TP JDBC avanc - 1 TP Outils et frameworks de mapping - 1 TPRichard Grin Objet-relationnel page 10

Client - Serveur Organisation gnrale dune application dentrepriseCette architecture a montr ses limites dans le cadre des applications dentreprise complexes : n client riche difficile installer / dployer n dpendance forte vis--vis des outils de persistance et de la couche de prsentation n enchevtrement des services techniques (concurrence, persistance, transactionnel, scurit,) avec les processus mtier

Richard Grin

Objet-relationnel

page 11

Richard Grin

Objet-relationnel

page 12

2

Architecture 3-tiers (ou n-tiers)Les nouvelles architectures prconises ajoutent au moins une couche (tiers, niveau) entre le client et le serveur Dans cette couche tournent n les traitements mtiers des applications n les processus techniques qui grent la scurit, le transactionnel,

Les diffrentes couches

Extrait dun article de Sbastien Ros sur le mapping Objet-relationnelRichard Grin Objet-relationnel page 13 Richard Grin Objet-relationnel page 14

Les couchesPrsentation, interface homme-machine (IHM) Traitements relatifs au domaine de lapplication (traitements mtiers ) avec les rgles de gestion en vigueur Enregistrement, rcupration et gestion des donnes persistantes dans une base de donnes

Les traitements mtier Ce sont les vrais traitements : ils font le travail essentiel lis au domaine de lapplication (comptabilit, facturation, calculs scientifiques,) Ils ncessitent des traitements techniques, non fonctionnels, pour grer la scurit, le transactionnel, la concurrence, Ces traitements techniques sont souvent runis sous le nom de couche services et pris en charge par le framework de dveloppement (container EJB par exemple)Richard Grin Objet-relationnel page 16

Richard Grin

Objet-relationnel

page 15

La couche de persistanceElle est compose de la base de donnes Le plus souvent on y ajoute une couche qui effectue la correspondance (mapping) entre les objets et la base de donnes (DAO, ORM) En effet, le passage du monde objet au monde relationnel (ou plus gnralement des objets mtier aux donnes enregistres) peut ncessiter des traitements complexes Souvent cette couche sert aussi de cache pour les objets rcuprs dans la BD et amliore donc les performancesRichard Grin Objet-relationnel page 17

Relations entre les couchesIl est admis par tous quaucune des 2 autres couches ne doit dpendre de la couche prsentation En effet, la couche prsentation est souvent modifie et cela ne doit pas induire des modifications dans les autres couches

Richard Grin

Objet-relationnel

page 18

3

Indpendance de la couche mtierLa couche mtier ne doit pas dpendre non plus de limplmentation de la couche de persistance Le plus souvent un processus mtier reste stable durant toute la vie de lapplication On ne doit les modifier que pour lamliorer ou le corriger mais pas pour tenir compte dune modification (le plus souvent technique) dans lune des autres couchesRichard Grin Objet-relationnel page 19

Fuites de la logique mtier vers la couche de prsentationLa logique mtier ne devrait pas se trouver dans la couche prsentation pour viter de la duplication de code et amliorer lindpendance entre les couches a signifie, par exemple, que la couche de prsentation doit appeler des mthodes des objets mtiers mais que le contenu de ces mthodes ne doit pas apparatre dans la couche de prsentationRichard Grin Objet-relationnel page 20

Fuites de la logique mtier vers la couche de persistanceLa couche de persistance doit dpendre le moins possible de la couche mtier Une indpendance totale est videmment impossible Cependant une bonne indpendance (par lutilisation de vues par exemple) permettra dans certain cas dviter quune modification du modle objet nimplique automatiquement une modification de la couche de persistanceRichard Grin Objet-relationnel page 21

4

Prsentation JDBC de baseUniversit de Nice - Sophia Antipolis Richard GrinVersion 2.9.6 16/9/06

JDBC (Java Data Base Connectivity) permet l'accs des bases de donnes avec le langage SQL, depuis un programme en Java Il est fourni par le paquetage java.sql LAPI JDBC est presque totalement indpendante des SGBDs (quelques mthodes ne peuvent tre utilises quavec certains SGBDs mais ne doivent tre utilises quen cas de ncessit imprieuse pour amliorer les performances)R. Grin JDBC page 2

Versions de SQL supportesLes premires versions de JDBC supportent le standard SQL-2 Entry Level JDBC 2 et 3 offrent en plus des fonctionnalits de SQL3 Pour des raisons d'efficacit un driver peut utiliser les possibilits particulires d'un SGBD (c'est permis par JDBC), mais au dtriment de la portabilit JDBC 4 qui sortira avec Java 6 au 4me trimestre 2006 utilisera les annotations et apportera plus de facilits pour lcriture du codeR. Grin JDBC page 3

Contenu de java.sqlCe paquetage contient un grand nombre d'interfaces et quelques classes Les interfaces constituent linterface de programmation JDBC ne fournit pas les classes qui implantent les interfaces

R. Grin

JDBC

page 4

DriversPour travailler avec un SGBD il faut disposer de classes qui implantent les interfaces de JDBC Un ensemble de telles classes est dsign sous le nom de driver JDBC Les drivers dpendent du SGBD auquel ils permettent d'accder Tous les SGBD importants du march ont un (et mme plusieurs) driver JDBC, fourni par l'diteur du SGBD ou par des diteurs de logiciels indpendantsR. Grin JDBC page 5

Types de driversType 1 : pont JDBC-ODBC Type 2 : driver qui fait appel des fonctions natives non Java (le plus souvent en langage C) de l'API du SGBD que l'on veut utiliser Type 3 : driver qui permet l'utilisation d'un serveur middleware Type 4 : driver crit entirement en Java, qui utilise le protocole rseau du SGBD

R. Grin

JDBC

page 6

1

Type 1 : pont JDBC-ODBCApplication Java Driver JDBC Driver ODBC Les mthodes du driver JDBC font appel des fonctions en langage C d'un driver ODBC (en Java) (pas en Java)

Type 2 : utilise une API nativeApplication Java Partie en Java Partie native (en Java) (pas en Java)

Les mthodes du driver JDBC font appel des fonctions d'une API du SGBD crite dans un autre langage que Java

Driver

Protocole du SGBD

SGBDR. Grin JDBC page 7 R. Grin JDBC

SGBDpage 8

Type 3 : accs un serveur middlewareApplication Java

Type 4 : 100 % Java avec accs direct au SGBDApplication Java Driver en Java

Les mthodes du driver JDBC se connectent par socket au serveur middleware et lui envoient les requtes SQL ; le serveur middleware les traitent en se connectant au SGBD

Driver en Java Protocole du serveur middleware Serveur middleware

Les mthodes du driver JDBC utilisent des sockets pour dialoguer avec le SGBD selon son protocole rseauSGBD

Protocole du SGBD

SGBDR. Grin JDBC page 9 R. Grin JDBC

page 10

Types de drivers et applet untrustedUne applet ne peut pas charger distance du code natif (non Java) ; elle ne peut donc pas utiliser les drivers de type 1 et 2 Pour des raisons de scurit, une applet untrusted ne peut changer des donnes par sockets qu'avec la machine d'o elle provient, ce qui implique des contraintes avec les drivers de type 3 et 4

Driver de type 3 et applet untrustedLe serveur middleware doit tre sur la mme machine que le serveur HTTP Code Java Applet Driver en Java connexion par socket Serveur HTTP Serveur middleware

SGBDR. Grin JDBC page 11 R. Grin JDBC page 12

2

Driver de type 4 et applet untrustedCode Java Le serveur HTTP doit tre sur la mme machine que le SGBD Driver en Java Applet

Travailler avec JDBCconnexion par socket

Serveur HTTP

SGBDJDBC page 13 R. Grin JDBC page 14

R. Grin

Pour utiliser JDBCA lexcution, ajouter le chemin des classes du (des) driver dans le classpath (option -classpath de la commande java) Par exemple, si Oracle est install dans /oracle, le driver peut tre dans le fichier/oracle/jdbc/lib/ojdbc14.jar

Dans les classes qui utilisent JDBCImporter le paquetage java.sql (et java.math si on utilise la classe BigDecimal) :import java.sql.*;

Charger en mmoire la classe du (des) driver (driver de type 4 fourni par Oracle pour cet exemple) avant d'utiliser JDBC :Class.forName( "oracle.jdbc.driver.OracleDriver");

et lapplication sera lance par la commandejava classpath /oracle/jdbc/lib/ojdbc14.jar ...

Inutile avec JDBC 4 !

R. Grin

JDBC

page 15

R. Grin

JDBC

page 16

tapes du travail avec une base de donnes avec JDBC1. Ouvrir une connexion (Connection) 2. Crer des instructions SQL (Statement, PreparedStatement ou CallableStatement) 3. Lancer l'excution de ces instructions :n n n

Classes et interfaces de JDBC

interroger la base (executeQuery()) ou modifier la base (executeUpdate()) ou tout autre ordre SQL (execute())

4. Fermer la connexion (close())R. Grin JDBC page 17 R. Grin JDBC page 18

3

AvertissementNous tudierons tout d'abord les classes et mthodes de base de JDBC Les nouvelles possibilits de JDBC 2 et 3, en particulier celles qui sont lies SQL3, seront abordes dans une autre partie Dans la suite du cours on utilise des raccourcis du type instance de Connection Comme Connection est une interface, il faut traduire par instance dune classe qui implmente Connection

R. Grin

JDBC

page 19

R. Grin

JDBC

page 20

Interfaces principalesDriver : renvoie une instance de Connection Connection : connexion une base Statement : ordre SQL PreparedStatement : ordre SQL paramtr CallableStatement : procdure stocke sur le SGBD ResultSet : lignes rcupres par un ordre SELECT ResultSetMetaData : description des lignes rcupres par un SELECT DatabaseMetaData : informations sur la base de donnesR. Grin JDBC page 21

Classes principalesDriverManager : gre les drivers, lance les connexions aux bases Date : date SQL Time : heures, minutes, secondes SQL TimeStamp : date et heure, avec une prcision la microseconde Types : constantes pour dsigner les types SQL (pour les conversions avec les types Java)

R. Grin

JDBC

page 22

ExceptionsSQLException : erreurs SQL SQLWarning : avertissements SQL (classe fille de SQLException) ; le mcanisme de rcupration des avertissements est tudi plus loin DataTruncation : avertit quand une valeur est tronque lors d'un transfert entre Java et le SGBD (classe fille de SQLWarning)

Interface DriverLa mthode connect() de Driver prend en paramtre un URL et renvoie une instance de l'interface Connection Cette instance de Connection permettra de lancer des requtes vers le SGBD connect renvoie null si le driver ne convient pas pour se connecter la base dsigne par l'URL

Utilise par DriverManager ; pas visible par lutilisateur de lAPIR. Grin JDBC page 23 R. Grin JDBC page 24

4

URL d'une base de donnesUn URL pour une base de donnes est de la forme : jdbc:sous-protocole:base de donne Par exemple, pour Oracle : jdbc:oracle:thin:@sirocco.unice.fr:1521:INFO n oracle:thin est le sous-protocole (driver thin ; Oracle fournit aussi un autre type de driver) n @sirocco.unice.fr:1521:INFO dsigne la base de donnes INFO situe sur la machine sirocco (le serveur du SGBD coute sur le port 1521) La forme exacte des parties sous-protocole et base de donnes dpend du SGBD cibleR. Grin JDBC page 25

Gestionnaire de driversLa classe DriverManager gre les drivers (instances de Driver) disponibles pour les diffrents SGBD utiliss par le programme Java Pour qu'un driver soit utilisable, on doit charger sa classe en mmoire :Class.forName("oracle.jdbc.driver.OracleDriver");

La classe cre alors une instance d'elle mme et enregistre cette instance auprs de la classe DriverManagerR. Grin JDBC page 26

Obtenir une connexionPour obtenir une connexion un SGBD, on demande cette connexion la classe gestionnaire de drivers :static final String url = "jdbc:oracle:thin:@sirocco.unice.fr:1521:INFO"; Connection conn = DriverManager.getConnection(url, "toto", "mdp");

Connexions et threadsLes connexions sont des ressources coteuses, et surtout longues obtenir On peut donc tre tent de les rutiliser dans plusieurs threads diffrents Mais, attention, les connexions ne peuvent tre partages par plusieurs threads la place, utiliser les pools de connexions fournis avec les sources de donnes (tudies dans une autre partie du cours)R. Grin JDBC page 28

La classe DriverManager s'adresse tour de rle tous les drivers qui se sont enregistrs (mthode connect), jusqu' ce qu'un driver lui fournisse une connexion (ne renvoie pas null)R. Grin JDBC page 27

TransactionsPar dfaut la connexion est en auto-commit : un commit est automatiquement lanc aprs chaque ordre SQL qui modifie la base Le plus souvent il faut enlever l'auto-commit : conn.setAutoCommit(false) Il faut alors explicitement valider ou annuler la transaction par n conn.commit() n conn.rollback()R. Grin JDBC page 29 R. Grin

Niveau disolationLe niveau disolation dune transaction peut tre modifi :conn.setTransactionIsolation( Connection.TRANSACTION_SERIALIZABLE);

JDBC

page 30

5

Instruction SQL simpleInstance de l'interface Statement La cration est effectue par la mthode createStatement() de Connection : Statement stmt = connexion.createStatement();

Excution de linstruction SQL simpleLa mthode appeler dpend de la nature de l'ordre SQL que lon veut excuter : n consultation (select) : executeQuery() renvoie un ResultSet pour rcuprer les lignes une une n modification des donnes (update, insert, delete) ou ordres DDL (create table,) : executeUpdate() renvoie le nombre de lignes modifies n si on ne connat pas l'excution la nature de l'ordre SQL excuter ou si l'ordre peut renvoyer plusieurs rsultats : execute()page 31 R. Grin JDBC page 32

R. Grin

JDBC

Consultation des donnes (SELECT)Statement stmt = conn.createStatement(); // rset contient les lignes renvoyes ResultSet rset = stmt.executeQuery("SELECT nomE FROM emp"); // On rcupre chaque ligne une une while (rset.next()) System.out.println (rset.getString(1)); // ou . . . (rset.getString("nomE")); stmt.close(); La premire colonne a le numro 1 Voir plus loin le transparent sur la R.fermeture des ressources Grin

Interface ResultSetexecuteQuery() renvoie une instance de ResultSet ResultSet va permettre de parcourir toutes les lignes renvoyes par le select Au dbut, ResultSet est positionn avant la premire ligne et il faut donc commencer par le faire avancer la premire ligne en appelant la mthode next() Cette mthode permet de passer la ligne suivante ; elle renvoie true si cette ligne suivante existe et false sinonR. Grin JDBC page 34

JDBC

page 33

Interface ResultSetQuand ResultSet est positionn sur une ligne les mthodes getXXX permettent de rcuprer les valeurs des colonnes de la ligne : n getXXX(int numroColonne) n getXXX(String nomColonne) (nom simple dunecolonne, pas prfix par un nom de table ; dans le cas dune jointure utiliser un alias de colonne)

ResultSet - performancesQuand le rseau est lent et que lon veut rcuprer de nombreuses lignes, il est parfois possible damliorer sensiblement les performances en modifiant le nombre de lignes rcupres chaque fois par le ResultSet (il faut effectuer des tests pour chaque cas) Pour cela, on utilise la mthode setFetchSize de Statement Cest seulement une indication quon donne au driver ; il nest pas oblig den tenir compteR. Grin JDBC page 36

XXX dsigne le type Java de la valeur que l'on va rcuprer, par exemple String, Int ou Double Par exemple, getInt renvoie un intR. Grin JDBC page 35

6

Types JDBC/SQLTous les SGBD n'ont pas les mmes types SQL ; mme les types de base peuvent prsenter des diffrences importantes Pour cacher ces diffrences, JDBC dfinit ses propres types SQL dans la classe Types, sous forme de constantes nommes Ils sont utiliss par les programmeurs quand ils doivent prciser un type SQL (setNull, setObject, registerOutParameter) Le driver JDBC fait la traduction de ces types dans les types du SGBDR. Grin JDBC page 37

Types JDBC/SQL (classe Types)CHAR, VARCHAR, LONGVARCHAR BINARY, VARBINARY, LONGVARBINARY BIT, TINYINT, SMALLINT, INTEGER, BIGINT REAL, DOUBLE, FLOAT DECIMAL, NUMERIC DATE, TIME, TIMESTAMPBLOB, CLOB ARRAY, DISTINCT, STRUCT, REF JAVA_OBJECTR. Grin JDBC

Types SQL3

page 38

Correspondances entre types Java et SQLIl reste le problme de la correspondance entre les types Java et les types SQL Dans un programme JDBC, les mthodes getXXX, setXXX servent prciser cette correspondance Par exemple, getString indique que lon veut rcuprer la donne SQL dans une String C'est le rle du driver particulier chaque SGBD de faire les traductions correspondantes ; une exception peut tre lance si a nest pas possibleR. Grin JDBC page 39

Correspondances avec getXXX()On a une grande latitude ; ainsi, presque tous les types SQL peuvent tre retrouvs par getString() Cependant, des mthodes sont recommandes ; voici des exemples :n

n

n n n

CHAR et VARCHAR : getString, LONGVARCHAR : getAsciiStream et getCharacterStream BINARY et VARBINARY : getBytes, LONGVARBINARY : getBinaryStream REAL : getFloat, DOUBLE et FLOAT : getDouble DECIMAL et NUMERIC : getBigDecimal DATE : getDate, TIME : getTime, TIMESTAMP : getTimestampJDBC page 40

R. Grin

Types Date en Java et en SQLjava.sql contient une classe Date pour faciliter les changes de dates entre Java et la base de donnes Cette classe hrite de la classe java.util.Date Elle correspond un temps en millisecondes et elle permet JDBC didentifier quil a affaire une date SQL ; pour se conformer au type DATE de SQL ce temps est tronqu 0 heure dans la journe Pour passer de java.util.Date java.sql.Date, utiliser la mthode getTime()R. Grin JDBC page 41

Manipulation des datesUn petit rappel sur les dates en Java : n mise en forme avec la classe java.text.DateFormatn

calculs sur les dates avec la classe java.util.Calendar

Voir le cours sur les dates dans le support Complments divers

R. Grin

JDBC

page 42

7

Valeur NULLStatement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery( "SELECT nomE, comm FROM emp"); while (rset.next()) { nom = rset.getString(1); commission = rset.getDouble(2); if (rset.wasNull()) System.out.println(nom + ": pas de comm"); else System.out.println(nom + " a " + commission + " de commission"); }R. Grin JDBC page 43

Modification des donnes (INSERT, UPDATE, DELETE)Statement stmt = conn.createStatement(); String ville = "NICE"; int nbLignesModifiees = stmt.executeUpdate( "INSERT INTO dept (dept, nomD, lieu) " + "VALUES (70, 'DIRECTION'," + "'" + ville + "')"); N'oubliez pas stmt.close(); l'espace !

R. Grin

JDBC

page 44

Instruction SQL paramtreLa plupart des SGBD (dont Oracle) peuvent n'analyser qu'une seule fois une requte excute un grand nombre de fois durant une connexion JDBC permet de profiter de ce type de fonctionnalit par l'utilisation de requtes paramtres ou de procdures stockes Les requtes paramtres sont associes aux instances de l'interface PreparedStatement qui hrite de l'interface StatementR. Grin JDBC page 45

Cration d'une requte paramtrePreparedStatement pstmt = conn.prepareStatement("UPDATE emp SET sal = ?" + " WHERE nome = ?");

Les "?" indiquent les emplacements des paramtres Cette requte pourra tre excutes avec plusieurs couples de valeurs : (2500, DUPOND), (3000, DURAND), etc.

R. Grin

JDBC

page 46

Requte paramtre Valeurs des paramtresLes valeurs des paramtres sont donnes par les mthodes setXXX(n, valeur) On choisit la mthode setXXX suivant le type Java de la valeur que l'on veut mettre dans la base de donnes C'est au programmeur de passer une valeur Java du bon type la mthode setXXX Le driver JDBC fait la conversion dans le bon format pour le SGBDR. Grin JDBC page 47

Requte paramtre - ExemplePreparedStatement pstmt = conn.prepareStatement( "UPDATE emp SET sal = ? " + "WHERE nomE = ?"); commence 1 et pas 0 for (int i=0; i 2 peut tre reprsente de plusieurs faons diffrentes Le plus simple est sans doute de reprsenter lassociation par une classe association qui contient des rfrences vers les objets qui participent lassociation Mais on peut aussi reprsenter une telle association par des collections de classes qui contiennent des collections ou des rfrences vers des classes qui contiennent des collectionsR. Grin Mapping objet-relationnel page 42

7

Exemple dassociation de degr > 2Une rservation dans une compagnie arienne peut tre considre comme une association entre les avions, les passagers et les numros de sige En effet, un passager peut occuper plusieurs siges (problme de sant par exemple)

Reprsentation par une classeclass Reservation { private Vol vol; private Passager passager; private int sige; . . . }

R. Grin

Mapping objet-relationnel

page 43

R. Grin

Mapping objet-relationnel

page 44

Autre reprsentationclass Vol { private Collection rsas; . . . } class Reservation { private Passager passager; private int sige; . . . }

Association de degr > 2 en relationnelDans le monde relationnel on cre une table pour traduire lassociation La cl primaire de cette table est forme d'un sous-ensemble des cls des tables qui traduisent les classes qui interviennent dans lassociation Le sous-ensemble peut tre strict si une dpendance fonctionnelle existe entre ces clspage 45 R. Grin Mapping objet-relationnel page 46

R. Grin

Mapping objet-relationnel

Exemple de traduction dune association de degr > 2RESERVATION(nVol, nSige, codePassager, )

Gestion des associations bidirectionnellesGrer une association est plus complexe dans le monde objet que dans le monde relationnel, surtout si elle est bidirectionnelle Par exemple, si un employ change de dpartement, il suffit de changer le numro de dpartement dans la ligne de lemploy En objet, il faut en plus enlever lemploy de la collection des employs du dpartement et le rajouter dans la collection de son nouveau dpartementR. Grin Mapping objet-relationnel page 48

En SQL :create table reservation( nvol varchar(10) references vol, nsiege integer, codePassager varchar(10) references passager, primary key(nVol, nSiege, codePassager), ...)

R. Grin

Mapping objet-relationnel

page 47

8

Gestion automatique de l autre bout dune associationCertains framework (EJB 2 par exemple), automatisent une partie de la gestion des associations Ainsi, si le champ dept dun employ est modifi, lemploy est pass automatiquement de la collection des employs du dpartement dorigine dans celle du nouveau dpartement Dautres frameworks comme Hibernate ou EJB 3/JPA prfrent ne rien automatiserR. Grin Mapping objet-relationnel page 49

Objet dpendantUn objet dont le cycle de vie dpend du cycle de vie dun autre objet auquel il est associ, appel objet propritaire Aucun autre objet que le propritaire ne doit avoir de rfrence directe vers un objet dpendant En ce cas, la suppression de lobjet propritaire doit dclencher la suppression des objets qui en dpendent (dclenchement en cascade )R. Grin Mapping objet-relationnel page 50

ExempleUne ligne de facture ne peut exister quassocie une (en-tte de) facture Si on supprime une facture, toutes les lignes de la facture doivent tre supprimes Tous les outils de mapping, comme JPA, offrent la possibilit dautomatiser les suppressions en cascade dobjets dpendants

Traduction de lhritage

R. Grin

Mapping objet-relationnel

page 51

R. Grin

Mapping objet-relationnel

page 52

ExemplePour fixer les ides, et ;-) pour reprendre des dessins du trs bon livre de Martin Fowler cit dans la bibliographie, on travaillera sur lexemple suivant tir du monde anglophone : n des sportifs qui peuvent tre des footballeurs ou des joueurs de crickets n parmi les joueurs de crickets, on distingue les joueurs qui lancent la balle : les bowlersPour en savoir plus sur le cricket : http://www.eleves.ens.fr/home/mlnguyen/divers/crick et/rules.htmlR. Grin Mapping objet-relationnel page 53

Classe abstraite

ExempleSportifs qui peuvent tre des footballeurs ou des joueurs de crickets n Parmi les joueurs de crickets, les joueurs qui lancent la balle : les bowlersn

R. Grin

Mapping objet-relationnel

page 54

9

Plusieurs mthodes de traductionReprsenter toutes les classes dune arborescence dhritage par une seule table relationnelle Reprsenter chaque classe instanciable (concrte) par une table Reprsenter chaque classe, mme les classes abstraites, par une table

Accessibilit des variablesCette remarque est valable quelle que soit la mthode de traduction de lhritage Toutes les variables dinstance ne sont pas ncessairement accessibles par toutes les classes filles (si elles ne sont pas protected et si elles ne possdent pas daccesseur protected ou public) Le code devra donc souvent trouver un moyen de demander chaque classe de la hirarchie dhritage de participer la persistance pour ses propres variablesR. Grin Mapping objet-relationnel page 56

R. Grin

Mapping objet-relationnel

page 55

Accessibilit des variablesPar exemple, si une instance dune classe fille veut se sauvegarder dans la base, il lui faudra trouver un moyen de rcuprer les variables dinstance de ses classes mres Un moyen est de faire appel une mthode de la classe mre par super. , cette mthode rcuprant les variables dinstance de la classe mreUn autre moyen, utilis par les outils de mapping, est la rflexivit Java qui permet doutrepasser les restrictions daccs accoles aux variables dinstanceR. Grin Mapping objet-relationnel page 57

PolymorphismeAssociation polymorphe : une classe contient une rfrence vers une classe mre abstraite Par exemple, une socit garde une rfrence vers un sportif (dun sport quelconque) quelle sponsorise Requte polymorphe : cas o on veut une information qui correspond une proprit qui appartient une classe mre Par exemple, on veut les noms de tous les joueursR. Grin Mapping objet-relationnel page 58

Toutes les classes traduites par une seule table

AvantagesSouvent la solution la plus simple mettre en place Cest dailleurs la solution la plus frquemment choisie Permet les requtes et associations polymorphes

Pour diffrencier les types de joueursR. Grin Mapping objet-relationnel page 59 R. Grin Mapping objet-relationnel page 60

10

InconvnientsOblige avoir de nombreuses colonnes qui contiennent la valeur NULL On ne peut dclarer ces colonnes NOT NULL , mme si cette contrainte est vraie pour une des sous-classes

Une table par classe

Colonne optionnelleR. Grin Mapping objet-relationnel page 61 R. Grin Mapping objet-relationnel page 62

Prservation de lidentitUn objet peut avoir ses attributs rpartis sur plusieurs tables (celles qui correspondent aux classes dune mme hirarchie dhritage) Son identit est alors prserve en donnant la mme cl primaire aux lignes qui correspondent lobjet dans les diffrentes tables Les cls primaires des tables correspondant aux classes filles sont des cls trangres vers la cl primaire de la classe mreR. Grin Mapping objet-relationnel page 63

Prservation de lidentitPour rcuprer les informations sur une instance dune classe fille, il suffit de faire une jointure sur ces cls primaires

R. Grin

Mapping objet-relationnel

page 64

AvantagesSimple : bijection entre les classes et les tables Permet les requtes et associations polymorphes

InconvnientSi la hirarchie dhritage est complexe ncessite de nombreuses jointures pour reconstituer les informations parpilles dans de nombreuses tables Do des instructions complexes, mais surtout de mauvaises performances La colonne type de la table Players permet de limiter un peu ce problme ; il est possible, par exemple, de retrouver les noms des footballers sans faire de jointurepage 65 R. Grin Mapping objet-relationnel page 66

R. Grin

Mapping objet-relationnel

11

Une table par classe concrte

RemarqueSi une classe concrte se retrouve au milieu de larbre dhritage avec des classes filles (comme ici la classe Cricketer), il faudra que les classes filles concrtes aient la mme cl primaire que la classe mre concrte dans les tables correspondantes

R. Grin

Mapping objet-relationnel

page 67

R. Grin

Mapping objet-relationnel

page 68

AvantagesCest la mthode la plus naturelle : une table par type dentit Pas de jointures pour retrouver les informations

InconvnientsNe peut traduire simplement les associations polymorphes Par exemple, une classe qui rfrence un joueur dun sport quelconque (joueur de football ou de cricket) En effet, aucune table relationnelle ne correspond un joueur dun sport quelconque et on ne peut donc imposer une contrainte dintgrit rfrentielle (cl trangre)R. Grin Mapping objet-relationnel page 70

R. Grin

Mapping objet-relationnel

page 69

SolutionAucune solution vraiment satisfaisante Des solutions partielles : n ignorer la contrainte dintgrit rfrentielle n mettre plusieurs colonnes dans la table qui rfrence, une pour chaque table concrte rfrence (mais a sera difficile dimposer lunicit de la rfrence ; sur lexemple, a sera difficile dimposer davoir une seule rfrence vers un joueur)R. Grin Mapping objet-relationnel page 71

Autre problmeDans le mme ordre dide, il est difficile dinterroger la base pour effectuer une requte polymorphe Par exemple, avoir le nom de tous les joueurs

R. Grin

Mapping objet-relationnel

page 72

12

SolutionOn devra lancer plusieurs selects (un pour chaque sous-classe concrte) et utiliser une union de ces selects Le select sera donc plus complexe et sans doute moins performant

Une solution viterSauf pour des cas bien prcis o le polymorphisme nest pas important, il vaut mieux viter cette solution Dailleurs, la version actuelle de la spcification EJB 3 nimpose pas aux serveurs dapplication doffrir cette possibilit de traduction de lhritage

R. Grin

Mapping objet-relationnel

page 73

R. Grin

Mapping objet-relationnel

page 74

VariantesDans une arborescence dhritage ces stratgies peuvent tre mlanges On peut, par exemple, crer plusieurs tables pour plusieurs branches de larborescence dhritage Mais le risque est de retomber sur les problmes de la stratgie 3 (une table par classe concrte) avec les requtes et les associations polymorphesR. Grin Mapping objet-relationnel page 75

Hritage multipleDans les cas o lhritage est traduit par des tables spares, lidentifiant dans les classes descendantes est lensemble des identifiants des classes mres

R. Grin

Mapping objet-relationnel

page 76

2 stratgies pour les associationsLorsquun objet est cr partir des donnes rcupres dans la base de donnes, 2 stratgies vis--vis des objets associs cet objet : n rcupration immdiate et cration des objets associs n les objets associs ne sont pas crs tout de suite, mais seulement lorsque lapplication en a vraiment besoinpage 77 R. Grin Mapping objet-relationnel page 78

Navigation entre les objets

R. Grin

Mapping objet-relationnel

13

Une situationRecherche dans la base de donnes dune facture qui vrifie un certain critre Un objet de la classe Facture qui correspond cette facture est cr Est-ce que les objets LigneFacture associs cette facture doivent aussi tre crs ? Et si la rponse est positive, faut-il crer aussi les objets Produit correspondants chaque ligne de facture ? Et si la rponse est positive, R. Grin Mapping objet-relationnel page 79

Le problmeLe risque est de crer un trs grand nombre dobjets, peut-tre inutiles Par exemple, si on veut rcuprer cette facture pour connatre seulement la date de facturation, on voit que tous ces objets associs sont totalement inutiles Do de mauvaises performances, sans raisons valables

R. Grin

Mapping objet-relationnel

page 80

Rcupration paresseuse La solution est le lazy loading , mot mot rcupration paresseuse , que lon peut traduire par rcupration la demande ou rcupration retarde

Rcupration paresseuse Quand un objet est cr partir des donnes enregistres dans la BD, les objets associs ne sont pas immdiatement crs Lobjet cr contient juste linformation ncessaire pour retrouver ces objets associs (cl primaire) Ces objets ne seront crs que si cest vraiment indispensable

R. Grin

Mapping objet-relationnel

page 81

R. Grin

Mapping objet-relationnel

page 82

ExempleSi on recherche la facture de numro 456, un objet f de la classe Facture est cr mais les objets correspondants aux lignes de la facture f ne sont pas crs Si le programme contient le code f.getLigne(i).getQuantite() lobjet LigneFacture correspondant la ime ligne de facture est cr et le message getQuantite() lui est envoyR. Grin Mapping objet-relationnel page 83

Problme des N + 1 selects On peut tomber sur le problme des N + 1 selects

R. Grin

Mapping objet-relationnel

page 84

14

Un exemple de N + 1 selects On veut rcuprer la facture qui a le plus gros total, parmi 5000 factures Si la rcupration des lignes se fait la demande, les objets Facture sont dabord rcupres (1 select), puis, pour chacune des 5000 factures, les lignes de facture associes sont rcupres pour calculer le total (5000 selects) Do un total de 5001 selects, alors quon peut obtenir le rsultat avec un seul select !R. Grin Mapping objet-relationnel page 85

Mauvaise solution pour les N + 1 selects Indiquer que la rcupration pour cette association doit toujours tre immdiate (dans les fichiers de configuration) ne convient pas le plus souvent En effet, dans dautres circonstances, on ne souhaitera pas charger les lignes de factures pour viter de crer trop dobjets inutiles

R. Grin

Mapping objet-relationnel

page 86

Solutions possibles (1)Lancer un ordre SQL ad hoc qui renvoie le total de la facture pour rsoudre le problme ponctuel (sans cration dobjets) Cest la solution la plus simple, mais elle peut ne pas convenir dans le cas o on veut des informations plus complexes sur les objets associs lobjet Il faut cependant retenir que, dans certaines circonstances, une bonne requte SQL vaut mieux que la cration de nombreux objetsR. Grin Mapping objet-relationnel page 87

Solutions possibles (2)La plupart des outils de mapping permettent de spcifier une stratgie spciale pour une requte particulire On peut alors indiquer que, par dfaut, le mode de rcupration ne sera pas immdiate, tout en spcifiant que la rcupration des objets associs devra tre immdiate pour une requte particulire

R. Grin

Mapping objet-relationnel

page 88

Code avec JPAString texteQuery = "select f from Facture f " + " join fetch f.lignes " + " where f.date > '1/1/06'"; Query query = em.createQuery(texteQuery); List liste = (List)query.getResultList(); System.out.println(liste.get(0).getLigne(0));

Code avec HibernateList results = session.createCriteria(Item.class) .add( Expression.eq("item.seller", user) ) .setFetchMode("bids", FetchMode.EAGER).list(); // vite duplication de rsultats (due au outer join) Iterator items = new HashSet(results).iterator(); List maxAmounts = new ArrayList(); while (items.hasNext()) { Item item = (Item) items.next(); BigDecimal max = new BigDecimal("0"); Iterator b = item.getBids().iterator(); while (b.hasNext()) { Bid bid = (Bid) b.next(); if ( bid.getAmount().compareTo(max) == 1 ) max = bid.getAmount(); } maxAmounts.add(new MaxAmount(item.getId(), max)); }R. Grin Mapping objet-relationnel page 90

Ne gnrera aucune requte SQL

R. Grin

Mapping objet-relationnel

page 89

15

Conclusion de cette sectionLa correspondance entre le modle objet et le modle relationnel nest pas une tche facile Les outils et framework ORM (tudis la fin de ce cours) rduisent grandement le code qui permet cette correspondance et facilitent donc les adaptations mutuelles des 2 modles

R. Grin

Mapping objet-relationnel

page 91

16

Types dapplications pour la persistanceUniversit de Nice Sophia-AntipolisVersion 0.7 16/9/06

Toutes les applications nont pas une complexit qui ncessite une architecture ntiers Ce cours dcrit les grands modles dapplications qui utilisent une base de donnes relationnelle

Richard Grin

Richard Grin

Types dapplication pour la persistance

page 2

Base de donnes prexistante ?La conception de lapplication va sans doute tre diffrente si la base de donnes est prexistante ou non Et si elle prexiste, si le dveloppeur de lapplication peut en modifier la structure ou non

3 modlesModle procdural Modle objet simple Modle objet avec utilisation dun outil de mapping videmment, ce dcoupage est trs schmatique Chacun de ces modles peut utiliser ou non des passerelles (DAO par exemple) pour isoler davantage le code qui gre la persistanceRichard Grin Types dapplication pour la persistance page 4

Richard Grin

Types dapplication pour la persistance

page 3

Autour des procduresPour les applications aux fonctionnalits les plus simples et pour un dveloppement rapide Le plus souvent la base de donnes est prexistante Lapplication est organise autour de procdures qui accdent directement la base de donnes quand cest ncessaire Utilisation possible de procdures stockes pour encapsuler les scnarios des cas dutilisationpage 5 Richard Grin Types dapplication pour la persistance page 6

Modle procdural

Richard Grin

Types dapplication pour la persistance

1

Exemple : classe GestionEmployesMthode void ajouter(int matricule, String nom,) ajoute un nouvel employ, en ajoutant une nouvelle ligne dans la base Mthode double getTotalDept(int dept) renvoie le total des salaires pour un dpartement, en lanant une requte SQL qui ramne le rsultat On peut se passer dune classe EmployeRichard Grin Types dapplication pour la persistance page 7

Pour des modles mtier simplesLes traitements de lapplication doivent tre pauvres en traitements mtier et essentiellement lis la persistance des donnes : n ajouts et suppressions denregistrements n modifications simples de donnes effectues directement par lutilisateur

Richard Grin

Types dapplication pour la persistance

page 8

Ce modle est limitOn est dans ce cas trs loign du modle objet ; on ne profite donc pas de ses atouts : n hritage n polymorphisme n facilit de rutilisation des objets n relations entre objets n Quand lapplication se complexifie il est difficile de lenrichir avec de nouvelles fonctionnalits et de rutiliser/partager du codeRichard Grin Types dapplication pour la persistance page 9 Richard Grin

Modle objet simple

Types dapplication pour la persistance

page 10

Un modle objet simpleLa correspondance entre les tables et les classes est le plus souvent bijective Chaque classe contient le code pour grer la persistance de ses propres instances Pattern appel active record par Martin Fowler

Exemple : classe EmployeLa table EMPLOYE lui est associ Elle contient la mthode dinstance ajouter() (on pourrait lappeler ajouteToiDansLaBase) qui ajoute une ligne dans la table EMPLOYE ; cette ligne contient les valeurs des attributs de linstance La classe contient aussi des mthodes sauvegarder() (ou modifier()), supprimer()Richard Grin Types dapplication pour la persistance page 12

Richard Grin

Types dapplication pour la persistance

page 11

2

Mthodes pour la rechercheElles peuvent tre mises : n dans une classe qui se charge des recherches (un finder) n en static dans la classe mtier qui correspond au type renvoy n dans le cas particulier o le critre de recherche correspond une des classes mtier, la mthode peut tre mise dans cette classe mtier (choix 3 du transparent suivant)Richard Grin Types dapplication pour la persistance page 13

ExempleUne mthode qui recherche tous les employs dun dpartement Choix 1 :List rechercher(Dept dept)

dans la classe RechercheEmploye Choix 2 :static List rechercher(Dept dept)

de la classe EmployeChoix 3 : List getEmployes() de la classe DepartementRichard Grin Types dapplication pour la persistance page 14

DsavantagesLe dsavantage est que les classes mtier sont trop lies au support de persistance utilis Problme principal : tout refactoring entranant une modification de la hirarchie va obliger revoir le code de la persistance Mais ce refactoring est rare si le modle objet est simple Lutilisation du pattern DAO peut amliorer la situation, mais seulement partiellementRichard Grin Types dapplication pour la persistance page 15

Utilisation dun outil de mapping

Richard Grin

Types dapplication pour la persistance

page 16

Un modle objet complexe avec outil de mappingPour les modles objets complexes avec beaucoup dhritage et de relations entre classes le modle prcdent se rvle vite difficile implmenter et maintenir Un outil de mapping ou un framework permet dautomatiser la correspondance objetrelationnel

Outils de mappingLa correspondance objet-relationnel est dcrite dans des fichiers des configuration ou par des annotations La persistance peut devenir presque transparente pour le dveloppeur qui crit le code Java Difficile dcrire soi-mme de tels outils car ils sont trs complexes

Richard Grin

Types dapplication pour la persistance

page 17

Richard Grin

Types dapplication pour la persistance

page 18

3

JPASpcification standard pour la persistance de objets Java (tudi la fin de ce cours) Implmentation de rfrence construite au dessus de Toplink Fait partie de la spcification EJB 3, framework pour les applications dentreprise

HibernateAvec Toplink, loutil de mapping le plus utilis dans le monde Java Utilise un gestionnaire de persistance, lintrospection et lenrichissement de code lexcution pour rcuprer les valeurs des proprits des objets et grer leur persistance En cours dadaptation au standard JPA

Richard Grin

Types dapplication pour la persistance

page 19

Richard Grin

Types dapplication pour la persistance

page 20

Autres possibilitsJDO (Java Data Objects) est une autre API qui offre des possibilits semblables JPA Utilise lenrichissement de code pendant la phase de compilation

Framework (cadre dedveloppement)Ensemble de classes et ressources prexistantes que le dveloppeur doit complter Utilisation dune librairie : lexcution est dirige par le code crit par le dveloppeur, qui fait appel aux classes de la librairie Utilisation dun framework : lexcution est dirige par le framework qui fait appel au code crit par le dveloppeurRichard Grin Types dapplication pour la persistance page 22

Richard Grin

Types dapplication pour la persistance

page 21

EJBLe framework standard pour les applications Java dentreprise, EJB (Entreprise Java Beans), est fourni par J2EE, la version dentreprise de Java Il ncessite lutilisation dun serveur dapplication qui est un logiciel lourd rserver pour les grosses applications dentreprises

EJBLes EJB sont des classes Java qui dcrivent le comportement des objets mtier Le dveloppeur crit le code li aux fonctionnalits des objets mtier, sans soccuper des services techniques (scurit, distribution sur plusieurs machines, transactions, persistance,) Le serveur dapplications utilise ce code pour y ajouter tous les services techniques indispensables au bon fonctionnement de lapplicationRichard Grin Types dapplication pour la persistance page 24

Richard Grin

Types dapplication pour la persistance

page 23

4

EJB EntitsIl existe plusieurs types dEJB Les EJB entits correspondent aux objets mtier persistants Leur persistance peut tre entirement prise en charge par le container dEJB fourni par le serveur dapplication

Problmes EJB entits version 2Les classes persistantes doivent hriter de certaines classes fournies par le framework Elles ne peuvent donc hriter dautres classes Le framework ne peut prendre en charge la persistance dobjets des classes Java ordinaires (POJO : Plain Old Java Object) Il est aussi difficile, sinon impossible, dutiliser les classes persistantes en dehors du container, en particulier pour les testsRichard Grin Types dapplication pour la persistance page 26

Richard Grin

Types dapplication pour la persistance

page 25

EJB version 3EJB 3 revoit en grande partie les EJB entits Sappuie sur JPA pour la persistance (tudi dans la suite du cours) Les beans entits nont plus hriter de classes spciales et peuvent tre tests en dehors du serveur dapplications

Avantages EJB entitsLavantage dutiliser les EJB entits est que la prise en charge est complte (scurit, transaction, distribution, accs concurrents,) Il est plus facile de maintenir le code lorsque lapplication monte en charge (plus grand nombre de connexions, distribution des serveurs sur plusieurs machines,)

Richard Grin

Types dapplication pour la persistance

page 27

Richard Grin

Types dapplication pour la persistance

page 28

PasserelleClasse qui contient tout le code pour grer la persistance Chaque table a une classe passerelle qui lui correspond Le reste de lapplication fait appel aux passerelles pour grer la persistance

Passerelles

Richard Grin

Types dapplication pour la persistance

page 29

Richard Grin

Types dapplication pour la persistance

page 30

5

UtilisationIsolent la persistance du reste de lapplication Facilitent les changements de SGBD et/ou permet dallger le code des classes mtier Peuvent tre utilises avec les 3 modles vus prcdemment

2 types de passerelleUne instance de passerelle par table (le plus frquent) Une instance de passerelle par ligne de table Le pattern DAO (Data Access Object), trs utilis et tudi plus loin dans ce cours, correspond au type une passerelle par table

Richard Grin

Types dapplication pour la persistance

page 31

Richard Grin

Types dapplication pour la persistance

page 32

Exemple de passerelleLa classe EmployeDAO gre la persistance des instances de la classe Employe et correspond la table employe Elle contient la mthode ajouter(int matricule, String nom,) La mthode prend en paramtre les informations sur lemploy ajouter car il existe une seule instance de la classe EmployeDAO pour tous les employsRichard Grin Types dapplication pour la persistance page 33 Richard Grin

Exemple de passerelleAvec une instance de passerelle par ligne, on aurait une mthode ajouter() car la passerelle aurait toutes les informations sur lemploy auquel elle est lie

Types dapplication pour la persistance

page 34

BibliographiePatterns of Entreprise Application Architecture de Martin Fowler Addison Wesley

Richard Grin

Types dapplication pour la persistance

page 35

6

Quelques patterns pour la persistance des objets avec DAOUniversit de Nice Sophia-AntipolisVersion 1.1 6/10/06

Ce cours prsente des modles de conception utiliss pour effectuer la persistance des objets

Richard Grin

R. Grin

Mapping objet-relationnel

page 2

Principe de baseIl est plus frquent de changer le modle de donnes des supports de persistance que de changer le modle mtier Pour faciliter ces changements il faut sparer le plus possible les entres-sorties des classes mtiers

DAOLe code pour la persistance est isol dans des objets spcifiques, les DAO (Data Acess Objects)

R. Grin

Mapping objet-relationnel

page 3

R. Grin

Mapping objet-relationnel

page 4

Utilit des DTOsLes DAOs sont situs sur une couche proche de la base de donnes Le code utilisateur des DAOs est souvent situ sur une autre couche distante Les DTOs peuvent tre utiliss pour transporter les donnes entre les diffrentes couches distantes

Le modle de conception DTO (Data Transfer Object)

R. Grin

Mapping objet-relationnel

page 5

R. Grin

Mapping objet-relationnel

page 6

1

DTOUn DTO contient ltat dun ou de plusieurs objets mtier, mais pas leur comportement Synonyme : Transfert Object (TO)

Exemples dutilisation des DTOTransporter les donnes dun objet distant pas transportable sur le rseau (pas srialisable) Transporter plusieurs objets distants en un seul appel distant ; par exemple une facture avec toutes les lignes de facture et les informations sur les produits Il faut viter les DTOs si lapplication est locale (pas distribue) : complications inutiles

R. Grin

Mapping objet-relationnel

page 7

R. Grin

Mapping objet-relationnel

page 8

Un fait importantLes appels de mthode distants sont beaucoup plus coteux que les appels locaux Le cot dpend peu de la quantit de donnes transfre chaque appel

Le problme rsoudreUn client souhaite rcuprer des donnes en interrogeant des objets distants non facilement transportables sur le rseau Exemple : rcuprer les nom, prnom, salaire et lieu de travail dun employ Sil utilise les accesseurs des classes des objets (getNom, getPrenom, getSalaire, getLieu), plusieurs appels distants sont ncessairesR. Grin Mapping objet-relationnel page 10

R. Grin

Mapping objet-relationnel

page 9

La solutionLe client demande un DTO la couche base de donnes , proche de la base de donnes qui contient toutes les valeurs dont il a besoin Cet objet est construit sur la couche base de donnes et pass en une seule fois au client

La solutionUn DTO peut aussi tre utilis, plus gnralement pour modifier un ou plusieurs objets distants (ou les donnes de la base de donnes) : n le DTO est cr ou modifi sur une couche de lapplication n il est pass une couche distante qui utilise ses donnes pour modifier un ou plusieurs objets distants (ou la base de donnes)R. Grin Mapping objet-relationnel page 12

R. Grin

Mapping objet-relationnel

page 11

2

Le problme rsoudreLe code pour la persistance varie beaucoup n avec le type de stockage (BD relationnelles, BD objet, fichiers simples, etc.) n avec les implmentations des fournisseurs de SGBD Si les ordres de persistance sont imbriqus avec le code mtier , il est difficile de changer de source de donnes

Le modle de conception DAO (Data Access Object)

R. Grin

Mapping objet-relationnel

page 13

R. Grin

Mapping objet-relationnel

page 14

La solutionEncapsuler le code li la persistance des donnes dans des objets DAO dont linterface est indpendante du support de la persistance Le reste de lapplication utilise les DAOs pour grer la persistance, en utilisant des interfaces abstraites, indpendantes du support de persistance ; par exemple, Employe getEmploye(int matricule)

DAOQuand lapplication a besoin deffectuer une opration lie la persistance dun objet, elle fait appel un objet DAO qui elle passe les informations ncessaires pour effectuer lopration Chaque classe dobjet mtier a son propre type de DAO (DAOEmploye, DAODepartement, ) Mais le mme objet DAO peut tre utilis pour tous les objets dune classe dobjet mtierR. Grin Mapping objet-relationnel page 16

R. Grin

Mapping objet-relationnel

page 15

Utilit des DAOsPlus facile de modifier le modle de la base de donnes Factorise le code daccs la base de donnes Plus facile pour le spcialiste des BD doptimiser les accs (ils nont pas parcourir toute lapplication pour examiner les ordres SQL) Sans doute le modle de conception le plus utilis dans le monde de la persistanceR. Grin Mapping objet-relationnel page 17

Emplacement des DAOsLes DAOs sont placs dans la couche dite daccs aux donnes qui est souvent sur une autre machine que la couche des objets mtiers Les changes de messages entre les DAOs et les objets mtiers engendrent donc souvent des appels distants et des DTO peuvent donc tre utiliss pour amliorer la vitesse des changesR. Grin Mapping objet-relationnel page 18

3

CRUDCet acronyme, souvent utilis dans le monde de la persistance, dsigne les 4 oprations de base de la persistance qui sont implmentes dans un DAO : create, retrieve, update et delete Les DAO peuvent aussi grer les connexions/dconnexions la source de donnes et les transactions

CRUDCreate pour crer une nouvelle entit dans la base Retrieve pour retrouver une ou plusieurs entits de la base Update pour modifier une des entits de la base Delete pour supprimer une entit de la base Plusieurs variantes pour les signatures de ces mthodes dans les DAOsR. Grin Mapping objet-relationnel page 20

R. Grin

Mapping objet-relationnel

page 19

createPrend en paramtre ltat de la nouvelle entit Cet tat peut tre donn n par une srie de paramtres des types des donnes : create(int id, String nom,) n par un DTO : create(DTOxxx dto) n par lobjet mtier que lon veut rendre persistant : create(Article article)

create comparaison des variantesLa 1re variante est sans doute la plus frquemment utilise et la plus souple La dernire variante ne convient que si lobjet mtier a toutes ses proprits publiques et sil est facilement transportable Mais elle peut tre pratique et performante dans les cas o elle est applicable

R. Grin

Mapping objet-relationnel

page 21

R. Grin

Mapping objet-relationnel

page 22

createLe type retour peut tre n void (la variante la plus utilise) n boolean, pour indiquer si la cration a pu avoir lieu n lidentificateur de lentit ajoute (utile si lidentificateur est gnr automatiquement) n un objet mtier ou un DTO correspondant lentit ajoute La variante avec objet mtier a les mmes inconvnients (et avantages) que pour le passage de paramtre dun objet mtierR. Grin Mapping objet-relationnel page 23

retrieve3 types de finder, suivant quil retourne n un seul objet n une collection dobjets n une valeur calcule partir de plusieurs entits (agrgation)

R. Grin

Mapping objet-relationnel

page 24

4

Finder qui retourne un objetOn lui passe en paramtre un identificateur de lentit cherche Il retourne un objet mtier qui correspond lentit cherche, ou un DTO qui contient les donnes de lentit cherche

Finder qui retourne une collectionOn lui passe en paramtre le critre de slection, sous une forme quelconque n objet ou valeurs critre de slection n objet exemple Le type retour peut tre trs divers : n ResultSet n RowSet n Collection (Collection, List, Set,) dobjets mtier ou de DTOs n tableau (rare)R. Grin Mapping objet-relationnel page 26

R. Grin

Mapping objet-relationnel

page 25

Finder qui retourne une valeur calculeLes valeurs calcules partir des donnes de plusieurs entits (exemple : total des salaires) peuvent sobtenir partir dobjets chargs en mmoire Mais il peut tre prfrable de ne pas crer les objets et dinterroger directement la base de donnes qui est optimise pour ce type de requte Un DAO peut ainsi comporter une mthode qui renvoie le total des salaires des employsR. Grin Mapping objet-relationnel page 27

updateDes variantes diverses pour les paramtres : n identificateur + valeurs (plusieurs paramtres pour les valeurs ou un seul DTO) n lobjet mtier dont on veut sauvegarder les modifications (ncessite un accs public aux valeurs qui seront modifies) Le type retour peut tre n void n boolean pour indiquer si la modification a pu avoir lieuR. Grin Mapping objet-relationnel page 28

deletePour les paramtres : n identificateur de lentit supprimer dans la base n lobjet mtier (ou un DTO) correspondant lentit supprimer dans la base Pour le type retour : n void n boolean pour indiquer si la suppression a pu avoir lieuR. Grin Mapping objet-relationnel page 29

DAO et exceptionsLes mthodes des DAO peuvent lancer des exceptions puisquelles effectuent des oprations dentres-sorties Les exceptions ne doivent pas tre lies un type de DAO particulier si on veut pouvoir changer facilement de type de DAO

R. Grin

Mapping objet-relationnel

page 30

5

DAO et exceptionsPour cela, on cre une ou plusieurs classes dexception indpendantes du support de persistance, dsignons-les par DAException (ou DataAccessException ou DaoException) Les mthodes des DAO attrapent les exceptions particulires, par exemple les SQLException, et relancent des DAException (auxquels sont chanes les exceptions dorigine pour faciliter la mise au point)R. Grin Mapping objet-relationnel page 31

2 stratgies dutilisation des DAOs1.

2.

Chaque objet mtier a une rfrence son DAO et lutilise pour sa propre persistance. Le programme qui manipule les objets mtier ne connat pas les DAOs Le programme qui manipule les objets mtier utilise directement les DAOs. Les objets mtier nont pas de rfrence un DAO (stratgie sans doute la plus frquemment utilise)

R. Grin

Mapping objet-relationnel

page 32

Stratgie 1Les programmes qui manipulent les objets mtier ne sont pas modifis par rapport un programme qui nutilise pas de DAO Seuls les objets mtier connaissent leur DAO Les objets mtier doivent avoir une rfrence vers le DAO quils utilisent Cette rfrence peut tre obtenue par une mthode static de la classe DAO (ce qui peut permettre de partager un DAO entre tous les objets mtier dune mme classe)R. Grin Mapping objet-relationnel page 33

Exemple de codeclass Stylo { private StyloDAO dao; ... on peut aussi public void sauvegardeToi() { construire un dao = getDAO(); TO pour le dao.insertOrUpdate(this); passer au DAO } private StyloDAO getDAO() { if (dao == null) Pour simplifier, on ne StyloDAO.getDAO(); tient pas compte des return dao; exceptions }R. Grin Mapping objet-relationnel page 34

Stratgie 2On rencontre le plus souvent la stratgie 2 On perd sans doute de la puret de la programmation objet

Exemple de code// ou styloDAO = new StyloDAO() StyloDAO styloDAO = StyloDAO.getDAO(); int idStylo = styloDAO.create("Marker", "noir ", DTO ou objet 120,...); mtier . . . Stylo stylo = styloDAO.findById(idStylo); Nouvelles styloDAO.update(idStylo, ...); List l = styloDAO.findAll(); valeurs pour le stylo

R. Grin

Mapping objet-relationnel

page 35

R. Grin

Mapping objet-relationnel

page 36

6

Exemple de code (variante)// ou styloDAO = new StyloDAO() StyloDAO styloDAO = StyloDAO.getDAO(); styloDAO.create(145, "Marker", "noir ", 120,...); . . . Stylo stylo = styloDAO.findById(1234); stylo.setPrix(45); styloDAO.update(stylo); List l = styloDAO.findAll();

Diagramme de classes (avec utilisation de TO)

Cette image (et les suivantes) sont extraites du Core J2EE Pattern Catalog de Sunpage 37 R. Grin Mapping objet-relationnel page 38

R. Grin

Mapping objet-relationnel

Diagramme de squences

DAO et connexionsUne connexion peut tre ouverte au dbut des mthodes du DAO, et ferme la fin des mthodes Cette stratgie peut coter cher si un pool de connexions nest pas utilis Le DAO peut aussi contenir des mthodes pour ouvrir et fermer une connexion ; en ce cas, une connexion peut tre utilise par plusieurs mthodes du DAO

Modification de plusieurs attributs persistants en utilisant un DTO : cration du DAO, puis rcupration des valeurs actuelles, R. Grin page 39 puis modification de ces Mapping objet-relationnel valeurs

R. Grin

Mapping objet-relationnel

page 40

DAO et transactionsLe plus souvent le DAO dmarre et termine lui-mme les transactions chaque mthode Dans les cas complexes, plusieurs DAOs associs plusieurs types dobjets mtier peuvent intervenir dans une transaction Dans ce cas, cest le client qui va grer les transactions Avec JDBC, a implique que les connexions ne sont pas ouvertes et fermes pour chaque mthode ; JTA na pas cette limitationR. Grin Mapping objet-relationnel page 41

Transactions gres par le clientLe client peut grer les transactions dans le cas dune application qui utilise JDBC, sans serveur dapplications, en lanant les mthodes commit() ou rollback() de la classe Connection Pour cela, il utilise linstance de Connection renvoye par la mthode du DAO qui ouvre une connexion (ou par une mthode getConnection() du DAO) Avec les serveurs dapplications, il existe des mthodes pour obtenir la transaction en coursR. Grin Mapping objet-relationnel page 42

7

DAO et hritageLe problme : une classe a des classes mres qui ont des proprits persistantes qui ne sont pas visibles de lextrieur (private, sans accesseurs visibles) Comment le DAO va pouvoir grer la persistance des instances de cette classe ?

DAO et hritageLa solution est de crer une hirarchie parallle de classes mappers dont les instances contiendront les mmes donnes que la hirarchie de la classe dont le DAO gre la persistance (voir le pattern Inheritance Mappers dans le livre de Martin Fowler donn dans la bibliographie) Chacune des classes mappers se charge des donnes qui la concerne pour fournir au DAO les donnes ncessaires aux changes avec la base de donnesR. Grin Mapping objet-relationnel page 44

R. Grin

Mapping objet-relationnel

page 43

Patterns pour rcuprer les DAOComment associer le bon DAO chaque classe mtier ? Si on change de SGBD, on doit changer de type de DAO Le pattern fabrique (factory) convient bien pour crer/rcuprer un DAO car il permet de cacher le type concret de la classe dune instance que lon cre Par exemple, une fabrique de DAOs peut retourner un DaoOracle ou un DaoDb2 suivant les circonstancespage 45 R. Grin Mapping objet-relationnel page 46

Le modle de conception fabrique abstraite

R. Grin

Mapping objet-relationnel

ExempleLa classe FabriqueDaoStylo contient une mthode getDao() qui renvoie un DaoStyloOracle ou un DaoStyloDb2 selon lenvironnement

Fabrique abstraiteLe pattern fabrique abstraite permet de changer facilement de source de donnes En une seule ligne de code tous les DAOs peuvent tre remplacs par des DAOs adapts la nouvelle source

R. Grin

Mapping objet-relationnel

page 47

R. Grin

Mapping objet-relationnel

page 48

8

Fabrique abstraiteUne fabrique abstraite est un type abstrait qui permet de cacher les types rels dun ensemble de fabriques concrtes Chaque fabrique concrte fournit tous les DAOs (DAOStylo, DAORamette,) associs une certaine source de donnes Dans la ligne de code, on rcupre la bonne fabrique de DAOs, associe la bonne source de donnesR. Grin Mapping objet-relationnel page 49

Le type abstrait

Code client (dbut)

La ligne de code pour DAOFactory daoFactory = changer de SGBD DAOFactory.getDAOFactory( DAOFactory.TypeDao.MYSQL); styloDAO = daoFactory.getStyloDAO(); // cre un nouveau stylo dans la base int styloNo = styloDAO.create(...); // Trouve un stylo StyloTO styloTO = styloDAO.find(...); // Modifie des valeurs du TO styloTO.setPrix(125); // Modifie le stylo dans la base styloDAO.update(styloTO);R. Grin Mapping objet-relationnel page 50

Code client (suite)// Supprime un stylo de la base styloDAO.delete(styloNo); // Trouve tous les stylos dune marque StyloTO styloEx = new StyloTO(); styloEx.setMarque("Marker"); Collection listeStylos = styloDAO.selectTO(styloEx);

Fabrique abstraite 1 DAOLa fabrique abstraite Les fabriques concrtes

...Les DAOs crsR. Grin Mapping objet-relationnel page 51 R. Grin Mapping objet-relationnel page 52

Fabrique abstraite 1 source de donnes

Fabrique abstraite schma global

Une fabrique concrte cre tous les DAOs associs une source de donnes

R. Grin

Mapping objet-relationnel

page 53

R. Grin

Mapping objet-relationnel

page 54

9

Code pour fabrique abstraiteLe code qui suit est un exemple schmatique de lutilisation du pattern DAO, avec le pattern fabrique abstraite (inspir fortement dun exemple donn par Sun) Il utilise aussi le pattern TO Important : ce pattern TO peut tre vit si les objets persistants peuvent tre transports entre les diffrentes couches dune application (par exemple, pour une application locale, ou en utilisant les objets dtachs de Hibernate)R. Grin Mapping objet-relationnel page 55

La fabrique abstraitepublic abstract class DAOFactory { public enum TypeDao {MYSQL, ORACLE}; public abstract StyloDAO getStyloDAO(); public abstract FactureDAO getFactureDAO(); ... public static DAOFactory getDAOFactory(TypeDao typeDao) { switch (typeFabrique) { case MYSQL: return new MysqlDAOFactory(); case ORACLE: return new OracleDAOFactory(); default: ... ; // erreur } } }R. Grin Mapping objet-relationnel page 56

Une fabrique concrtepublic class MySQLDAOFactory extends DAOFactory { @Override public StyloDAO getStyloDAO() { return new MySQLStyloDAO(); } @Override public FactureDAO getFactureDAO() { return new MySQLFactureDAO(); } ... }R. Grin Mapping objet-relationnel page 57

Interface des DAO pour Stylopublic interface StyloDAO { public int insert(...); public boolean delete(...); public StyloTO find(...); public boolean update(...); public RowSet selectRS(...); public Collection selectTO(...); ... }

R. Grin

Mapping objet-relationnel

page 58

DAO concret pour Styloimport java.sql.*; public class MySQLStyloDAO implements StyloDAO { public MySQLStyloDAO() { ... } public int insert() { ... } public boolean delete() { ... } public StyloTO find() { ... } public boolean update(...); public RowSet selectRS(...); public Collection selectTO(...); ... }R. Grin Mapping objet-relationnel page 59

TO pour Styloimport java.io.Serializable; public class StyloTO implements Serializable { private String reference; private String name; ... // Accesseurs et modificateurs public String getReference() {...} public void setReference(String ref) {...} ... }R. Grin Mapping objet-relationnel page 60

10

BibliographiePatterns of Entreprise Application Architecture de Martin Fowler Addison Wesley Prsentation du pattern DAO et implmentation en Java, par Sun : http://java.sun.com/blueprints/corej2eepattern s/Patterns/DataAccessObject.html

R. Grin

Mapping objet-relationnel

page 61

11

Modle objet - relationnel SQL99Universit de Nice Sophia-AntipolisVersion 0.9.5 16/9/06

Introduction

Richard Grin

R. Grin

Objet-relationnel

page 2

Modle objet-relationnelLe modle objet-relationnel (OR) reprend le modle relationnel en ajoutant quelques notions qui comblent les plus grosses lacunes du modle relationnel La compatibilit est ascendante : les anciennes applications relationnelles fonctionnent dans le monde OR La norme SQL99 (SQL3) reprend beaucoup d'ides du modle ORR. Grin Objet-relationnel page 3

Pourquoi tendre le modle relationnel ?La reconstitution dobjet complexes clats en tables relationnelles est trs coteuse car elle occasionne de nombreuses jointures Pour chapper aux clatements-jointures, l'OR rhabilite n les rfrences qui permettent d'implanter des structures complexes n les attributs multivalues (tableaux, ensembles ou listes)R. Grin Objet-relationnel page 4

Pourquoi tendre le modle relationnel ?L'utilisation de rfrences facilite aussi l'utilisation des donnes trs volumineuses du multimdia en permettant leur partage simplement et moindre cot (sans jointure)

Pourquoi tendre le modle relationnel ?Limpossibilit de crer de nouveaux types implique un manque de souplesse et une interface difficile avec les applications orientes objet L'OR permet de dfinir de nouveaux types utilisateur simples ou complexes (User data type), avec des fonctions ou procdures associes comme dans les classes des langages objetR. Grin Objet-relationnel page 6

R. Grin

Objet-relationnel

page 5

1

Pourquoi tendre le modle relationnel ?L'OR supporte l'hritage de type pour profiter du polymorphisme et faciliter la rutilisation

Pourquoi ne pas passer directement aux SGBD Objet ?Le relationnel a ses avantages, en particulier n sa grande facilit et efficacit pour effectuer des recherches complexes dans des grandes bases de donnes n la facilit de spcifier des contraintes dintgrit sans programmation n une thorie solide et des normes reconnues

R. Grin

Objet-relationnel

page 7

R. Grin

Objet-relationnel

page 8

Pourquoi ne pas passer directement aux SGBD Objet ?Inertie de l'existant : de trs nombreuses bases relationnelles en fonctionnement Manque de normalisation pour les SGBDO ; trop de solutions propritaires Moins souple que le relationnel pour sadapter plusieurs applications et laugmentation de chargePeu d'informaticiens forms aux SGBDO

Les nouvelles possibilits de lORDfinir de nouveaux types complexes avec des fonctions pour les manipuler Une colonne peut contenir une collection (ensemble, sac, liste) Ligne considre comme un objet, avec un identificateur (Object Identifier OID) Utilisation de rfrences aux objets Extensions du langage SQL (SQL3 ou SQL99) pour la recherche et la modification des donnesR. Grin Objet-relationnel page 10

Le modle OR peut permettre un passage en douceur R. Grin Objet-relationnel page 9

Les problmes de l'ORNe s'appuie pas sur une thorie solide comme le modle relationnel Manque de standard de fait : implantations diffrentes, et encore partielles, dans les divers SGBDs

SQL99 (SQL3)Cette partie du cours sappuie autant que possible sur les spcifications de SQL99 Le langage de programmation SQL99 ajoute SQL2 des variables et instructions de contrle pour en faire un langage procdural complet ; ce cours ne porte pas sur ces extensions Les exemples concrets sont donns dans le langage SQL de la version 10g dOracle ; les diffrences avec SQL99 seront signalesR. Grin Objet-relationnel page 12

R. Grin

Objet-relationnel

page 11

2

Nouveaux types prdfinisLe relationnel objet ajoute des types prdfinis la norme SQL (tudis plus loin dans le cours) : n rfrence n collection n LOB (li aux objets de grande taille)

Types dfinis par lutilisateur

R. Grin

Objet-relationnel

page 13

R. Grin

Objet-relationnel

page 14

Les types utilisateurLe dveloppeur peut aussi crer ses propres types de donnes : n types distincts n types structurs

Types distincts Ces types permettent de mieux diffrencier les domaines des colonnes ; ils sont forms partir des types de base :CREATE TYPE codePays as char(2); CREATE TYPE matricule as integer;

Par exemple, pour diffrencier le domaine des colonnes matricule et numDept Ces types sutilisent exactement avec les mmes instructions que le type de base sousjacentR. Grin Objet-relationnel page 15 R. Grin Objet-relationnel page 16

Types structursCorrespondent aux classes des langages objets Ils peuvent contenir des constructeurs, attributs ( variables dinstances), fonctions et procdures ( mthodes) Les membres peuvent tre public, protected ou private Les fonctions et procdures peuvent tre crites en SQL ou en un autre langage

Cration dun type de donnesLa syntaxe est semblable celle de la cration dune table :CREATE TYPE departement_type AS OBJECT (numDept integer, nomD varchar(30), lieu varchar(30));

Un type ne peut contenir de contrainte dintgrit La commande create or replace type permet de redfinir un type sil existe djR. Grin Objet-relationnel page 18

R. Grin

Objet-relationnel

page 17

3

Fonctions dans les typesCREATE TYPE departement_type AS OBJECT (numDept integer, nomD varchar(30), lieu varchar(30), MEMBER FUNCTION getLieu RETURN varchar); CREATE TYPE BODY departement_type AS MEMBER FUNCTION getLieu RETURN varchar IS begin return lieu; end; end;R. Grin Objet-relationnel page 19

HritageLes types supportent lhritage multiple avec le mot-cl UNDER :create type employe_type as object (matr integer, nom varchar(30), sal numeric(8,2)) not final; create type commercial_type under employe_type (comm numeric(8,2)) not final;

Un type est final par dfautR. Grin Objet-relationnel page 20

Ajout dun attribut dans un typealter type employe_type add attribute date_naissance date cascade; Propage aux tables dj construites partir du type

Ajout dune mthode/fonction un typealter type employe_type add member function age return integer cascade;

R. Grin

Objet-relationnel

page 21

R. Grin

Objet-relationnel

page 22

Type de ligneSQL99 possde aussi la notion de type de ligne qui correspond aux structures du C : cest un ensemble non encapsul dattributs Le type peut tre nomm ou non

Type de ligne non nommcreate table EMP (nomE varchar(35), adresse ROW(numero integer, rue varchar(30),))

R. Grin

Objet-relationnel

page 23

R. Grin

Objet-relationnel

page 24

4

Type de ligne nommCREATE ROW TYPE adresse_t (numero integer, rue varchar(30),) On peut ensuite utiliser ce type pour une dclaration dattribut ou mme pour crer une table partir de ce type (comme pour les autres types)

Vues du dictionnaire des donnesUSER_TYPES pour les types (et les collections) USER_TYPE_ATTRS pour attributs des types USER_TYPES_METHODS pour les mthodes des

typesUSER_OBJECT_TABLES pour les tables objet-

relationnelles Sous sqlplus de Oracle : describe departement_type

R. Grin

Objet-relationnel

page 25

R. Grin

Objet-relationnel

page 26

Cration dune table partir dun type TablesLes donnes dun type ne sont persistantes que si elles sont ranges dans une table On peut crer des tables comme en SQL92 On peut aussi crer des tables partir dun type de donnes

R. Grin

Objet-relationnel

page 27

R. Grin

Objet-relationnel

page 28

Cration dune table partir dun typeSoit le type employe_type :CREATE TYPE employe_type AS OBJECT (matricule integer, nom varchar(30), . . . dept integer);

Hritage de tablesUne table peut hriter dune ou plusieurs tables Pas support par Oracle 10g

On peut crer une table partir de ce type et indiquer des contraintes dintgrit :create table employe OF employe_type (primary key (matricule));R. Grin Objet-relationnel page 29 R. Grin Objet-relationnel page 30

5

Cration de table partir dun type drivcreate table commerciaux of commercial_type (constraint pk_com primary key(matr));

Caractristiques dune table objet-relationnelleUne table est une table objet-relationnelle si elle a t construite partir dun type (create table OF) Les lignes de ces tables sont considres comme des objets avec un identifiant (OID) On peut utiliser des rfrences pour dsigner les lignes de ces tables (pas possible pour les autres tables)R. Grin Objet-relationnel page 32

R. Grin

Objet-relationnel

page 31

Vues du dictionnaire des donnesUSER_OBJECT_TABLES pour les tables objet-

Insertion de donnesOn ajoute des donnes comme avec une table normale : insert into commerciaux (matr, nom, sal, comm) values (234, 'TITI', 3200, 600);

relationnelles

R. Grin

Objet-relationnel

page 33

R. Grin

Objet-relationnel

page 34

Insertion avec constructeurOn peut aussi utiliser le constructeur du type avec lequel la table a t construite : insert into employe values ( employe_type(125, 'Dupond', ...)); Si le type est un type utilis par un autre type, lutilisation du constructeur du type est obligatoire

ModificationsUtiliser la notation pointe comme en SQL92 :update employe set employe.salaire = 12000 where employe.nom = 'Dupond';

SQL99 fournit aussi la notation .. pour dsigner un attribut dune colonne de type structur :update employe set employe.adresse..numero = 12 where employe.nom = 'Dupond';

R. Grin

Objet-relationnel

page 35

R. Grin

Objet-relationnel

page 36

6

Appel de procdure ou fonctionselect e.nom, age(e) from employe e where age(e) < 40 Sous Oracle : select e.nom, e.age() from employe e where e.age() < 40Le this est pass en paramtre

Rfrences

R. Grin

Objet-relationnel

page 37

R. Grin

Objet-relationnel

page 38

RfrencesOn peut indiquer dans la dfinition dun type quun attribut contient des rfrences (et non des valeurs) des donnes dun autre type ; la syntaxe est REF nom-du-type :create type employe_type as object (matricule integer, nom varchar(30), . . . dept REF dept_type);

Exemple de select avec rfrenceLa notation pointe permet de rcuprer les attributs dun type dont on a un pointeur Lieu de travail des employes (avec Oracle) :select nom, e.dept.lieu from employe e

En SQL99 :select nom, e.dept->lieu from employe e

Attention, lalias e est indispensable

R. Grin

Objet-relationnel

page 39

R. Grin

Objet-relationnel

page 40

Insertions avec rfrenceinsert into employe values ( 1230, 'Durand', , NULL); pointeur NULL

Modifications avec rfrenceupdate employe set dept = (select REF(d) from dept d where numDept = 10) where matricule = 7500;

insert into employe(matricule, nom, dept) select 1240, 'Dupond', REF(d) from dept d where dept.numDept = 10; rfrence vers le dept de numro 10R. Grin Objet-relationnel page 41

Attention, cette instruction peut trs bien mettre la valeur NULL dans la colonne dept car le select renvoie NULL si le dpartement de numro 10 nexiste pas !R. Grin Objet-relationnel page 42

7

Contrainte NOT NULLPour viter le problme de lexemple prcdent, il faut ajouter la contrainte NOT NULL sur la colonne dept :dept REF dept_type NOT NULL

Contrainte sur les rfrencesLe type REF dept_type restreint le type rfrenc mais pas la table rfrence Une telle rfrence peut rfrencer une valeur de nimporte quelle colonne de table qui a le type dept_type La clause SCOPE restreint la colonne rfrence ; elle peut tre ajoute lors de la dfinition dune table

R. Grin

Objet-relationnel

page 43

R. Grin

Objet-relationnel

page 44

Exemple de SCOPEdept REF dept_type scope is dept_table

Rfrence perdueSCOPE ne suffit pas pour imposer une contrainte stricte Ainsi la rfrence peut tre pendante (dangling) ou perdue , cest--dire ne pas correspondre une ligne existante, si la ligne rfrence au dpart a t ensuite supprime

indique que dept rfrencera une ligne de la table dept_table (et pas une ligne dune autre table cre partir du type dept_type)

R. Grin

Objet-relationnel

page 45

R. Grin

Objet-relationnel

page 46

ReferencesPour viter les rfrences perdues il faut remplacer la contrainte SCOPE par une contrainte REFERENCES (comme avec les tables relationnelles) :dept REF dept_type references dept_table

Collections

R. Grin

Objet-relationnel

page 47

R. Grin

Objet-relationnel

page 48

8

Types de collectionsPour reprsenter une colonne multivalue, on peut utiliser les collections : n ensembles (au sens mathmatiques ; pas de doublons) n sacs (avec des doublons) n listes (ordonnes et indexes par un entier) Dautres types de collections peuvent tre ajoutes par les SGBD

Exemple de collectioncreate type employe_type (matricule integer, nom varchar(30), prenoms LIST(varchar(15)), enfants SET(personne), . . .);

R. Grin

Objet-relationnel

page 49

R. Grin

Objet-relationnel

page 50

Utilisation dune collectionOn peut utiliser une collection comme une table en la faisant prcder par le mot-cl TABLE :select nom from employe E where nom in (select * from TABLE(E.prenoms))

Les collections avec Oracle 10gOracle 10g noffre que 2 types de collections : n table imbrique (NESTED TABLE) qui est une collection non ordonne et non limite en nombre dlments n tableau prdimensionn (VARRAY) qui est une collection dlments de mme type, ordonne et limite en taille

On peut aussi faire afficher une collection comme un tout :select nom, prenoms from employe

R. Grin

Objet-relationnel

page 51

R. Grin

Objet-relationnel

page 52

Tables imbriquesUne table relationnelle (pas ncessairement OR) peut contenir une ou plusieurs tables imbriques Pas tudi dans ce cours ; se reporter au manuel Oracle pour plus de prcisions

Tableaux dimensionnsUn VARRAY est une collection ordonne et limite en nombre, dlments dun mme type On peut imbriquer plusieurs tableaux dimensionns en utilisant des pointeurs sur des tableaux

R. Grin

Objet-relationnel

page 53

R. Grin

Objet-relationnel

page 54

9

Exemple de VARRAYcreate type telephones_type as VARRAY(3) OF varchar(10); insert into personne (nom, telephones) values('Dupond', telephones_type('0492077987', '0492074567'));

RfrenceProgrammer objet avec Oracle de Christian Soutou Vuibert

R. Grin

Objet-relationnel

page 55

R. Grin

Objet-relationnel

page 56

10

Plan de cette partie

JDBC avancUniversit de Nice - Sophia AntipolisVersion 1.8 14/10/06 Richard Grin

Transaction et exception Gnration des cls ResultSet avanc RowSet Regrouper les modifications BLOB et CLOB Pool de connexions, source de donnes Transaction distribueR. Grin JDBC avanc page 2

Exception Rollback ?Une exception ne provoque pas le rollback dune transaction Cest le code Java qui doit explicitement appeler la mthode rollback() sil le faut Une exception peut signaler un problme rcuprable ; en ce cas le programme peut choisir une alternative pour terminer correctement la transaction

Transactions et exceptions

R. Grin

JDBC avanc

page 3

R. Grin

JDBC avanc

page 4

Quelques rgles usuellesLes exceptions non contrles correspondent souvent des erreurs non rcuprables ; en ce cas le catch correspondant lancera un rollback Les exceptions contrles sont parfois rcuprables ; par exemple, si la cl existe dj, on peut changer de cl, ou faire un update la place dun insert Chaque cas est particulier et peut suivre dautres rglesR. Grin JDBC avanc page 5

Exempletry { ... conn.commit(); } catch(SQLException e) { // La situation ne permet pas // de corriger le problme conn.rollback(); }

R. Grin

JDBC avanc

page 6

1

Exempletry { ... conn.commit(); } catch(SQLException e) { // La situation est rcuprable. // Le code qui suit corrige le problme . . . conn.commit(); }R. Grin JDBC avanc page 7

Gnration automatique de cls et JDBC

R. Grin

JDBC avanc

page 8

Gnration de clsLa gnration automatique de cls nest pas standardis Oracle utilise des squences (comme DB2 et PostgreSQL) Dautres SGBD utilisent dautres mthodes : n attribut AUTO_INCREMENT sur une colonne pour MySQL n attribut IDENTITY pour SQL Server nR. Grin JDBC avanc page 9

Une situation couranteUne situation peut ncessiter la connaissance dune cl gnre automatiquement Exemple : une facture est compose dune table pour len-tte de la facture (numro de la facture, client, date,) et dune table pour les lignes de la commande Pour crire les lignes de la facture on a besoin de connatre la cl de len-tte de la facture (chaque ligne contient une cl trangre vers cette cl de len-tte) et cette cl est gnre automatiquementR. Grin JDBC avanc page 10

Une situation couranteLa rcupration dune cl automatique ne devrait pas ncessiter de lancer une requte SQL avec un accs la base de donnes (toujours coteux)

getGeneratedKeysLinterface Statement contient une mthode ResultSet getGeneratedKeys() qui renvoie toutes les cls gnres par lordre SQL, indpendamment de la manire dont elles ont t gnres, et sans accs supplmentaire la base de donnes Le ResultSet renvoy est vide si aucune cl na t gnre

R. Grin

JDBC avanc

page 11

R. Grin

JDBC avanc

page 12

2

Lecture des cls gnres2 choses faire si on a besoin de connatre la cl gnre automatiquement par le SGBD au moment de linsertion dune nouvelle ligne : 1. indiquer la mthode executeUpdate que les cls gnres seront rcupres 2. utiliser la mthode getGeneratedKeys() aprs linsertion

Pour executeUpdatePour indiquer executeUpdate que lon souhaite rcuprer les cls gnres on doit indiquer dans un 2me paramtre n soit la valeur Statement.RETURN_GENERATED_KEYS n soit un tableau dentiers int[] indiquant les numros des colonnes du insert qui contiennent les cls gnrs que lon veut rcuprerR. Grin JDBC avanc page 14

R. Grin

JDBC avanc

page 13

ExempleAjout dune nouvelle facture dans la base On a besoin de la cl gnre pour la facture pour la mettre en cl trangre dans les lignes de la facture (ne marche pas avec Oracle ; utiliser plutt seq.currval)

ExempleStatement stmt = conn.createStatement(); // Ne pas oublier le 2me paramtre optionnel stmt.executeUpdate( "INSERT INTO facture VALUES(...)", Statement.RETURN_GENERATED_KEYS); ResultSet rsCles = stmt.getGeneratedKeys(); if ( rsCles.next() ) { int cle = rsCles.getInt(1); } // cle sera utilis pour insrer les // lignes de factureR. Grin JDBC avanc page 16

R. Grin

JDBC avanc

page 15

Problme dimplmentation ?Il semble que peu de drivers implmentent la mthode getGeneratedKeys Par exemple, le driver Oracle ne limplmente pas

Cls gnres et OraclePour Oracle on peut n rcuprer la valeur courante (ou prochaine) de la squence seq avec seq.currval (ou seq.nextval) dans une colonne dun select, n utiliser cette valeur dans les ordres insert de la facture et des lignes de facture Rappel : currval ne dpend que des cls gnres dans la session courante (ne dpend pas des cls g