760 likes | 919 Views
Institut National des Sciences Appliquées et de Technologie. Exposé Génie Logiciel Avancé :. Realisé par: Kaddouci Sarra Gebs Haithem. 1. Plan. Définition du mapping objet/relationnel Identification des problèmes de non correspondance entre les modèles objet et relationnel
E N D
Institut National des Sciences Appliquées et de Technologie Exposé Génie Logiciel Avancé : Realisé par: Kaddouci Sarra Gebs Haithem 1
Plan • Définition du mapping objet/relationnel • Identification des problèmes de non correspondance entre les modèles objet et relationnel • Solutions de l’ORM : correspondances entre les modèles • LA Solution : Hibernate • Nouveautés et fonctions avancées d’Hibernate 3.0 • Best Practices pour l’utilisation d’Hibernate
Introduction Pourquoi nous avons besoin du mapping objet/relationnel et pourquoi Hibernate consiste en une solution adéquate sinon la meilleur?
Mapping objet/relationnel : ORM • La plupart des applications sont actuellement développées en utilisant un langage objet et une base de données relationnelles. Celle-ci est chargée d’assurer le stockage de données de manière persistance indépendamment des programmes qui les traitent alors que le modèle objet gère des objets du monde réel en y associant des données et leur comportement. • Dès lors la cohabitation de ces deux mondes pose un certain nombre de problèmes tels que la persistance des données, la représentation de données complexes (hiérarchies, graphes), ou le passage systématique d’un modèle à un autre.
Mapping objet/relationnel : ORM Je veux travailler avec une base de données objet !!!! Le mapping objet/relationnel (Object/Relational Mapping : ORM) réfère à la technique de mapping d’une représentation de données d’un modèle objet vers un modèle relationnel de données basé sur un schéma SQL.
Différences entre le modèle relationnel et le modèle objet Identifier les différences entre le modèle objet et le modèle relationnel c’est identifier les difficultés qui se posent lorsqu’on cherche a établir un pont entre ces deux mondes. • Différence structurelle • Différence comportementale
Différences entre le modèle relationnel et le modèle objet : Structure • L’organisation des données : tabulaire, sous forme matricielle (lignes et colonnes) pour le modèle relationnel et sous la forme d’un graphe d’objets (ensembles d’attributs) pour le modèle objet. • Les types de données • L’héritage : concept absent du modèle relationnel. • Les liens entre entités
Différences entre le modèle relationnel et le modèle objet : Comportement • l’identité objet : dans le modèle objet, l’unicité des objets est uniquement fonction de l’unicité des pointeurs, tandis que dans le modèle relationnel, l’unicité des tuples est garantie par l’utilisation de clés primaires. • La persistance: ce terme est utilisé pour indiquer le fait qu'un objet peut être sauvegardé de façon plus ou moins automatisée. Le modèle objet ne couvre pas réellement la problématique de la persistance des objets. Par contre, dans le modèle relationnel, les données sont persistantes : une fois le schéma relationnel défini, les données ajoutées restent accessibles durablement.
Solutions de l’ORM Ces problèmes sont résolus grâce à la mise en oeuvre de techniques de transformation de modèles objets en modèles relationnels et vice versa nommées Mapping objet relationnel (ORM).
Correspondances entre le modèle objet et le modèle relationnel Classe Modèle Objet Modèle relationnel une « instance » d’une classe particulière, correspondra à un «enregistrement » de la table correspondante. Document Mapping objet-relationnel, Couches d’accès aux données etFrameworks de persistance par Sébastien Ros
Correspondances entre le modèle objet et le modèle relationnel Heritage Modèle Objet Modèle relationnel Le champ type contient le type de l’instance pour pouvoir charger les champs correspondants à chaque classe. Document Mapping objet-relationnel, Couches d’accès aux données etFrameworks de persistance par Sébastien Ros
Correspondances entre le modèle objet et le modèle relationnel Le champ « Size » a pour valeur NULL si l’enregistrement correspond à une instance de le classe «Circle», de même pour le champ «Diameter» pour l’instance de la classe « Square » Voici la table une fois remplie avec deux instances de la classe Circle, et une de la classe « Square ». Document Mapping objet-relationnel, Couches d’accès aux données etFrameworks de persistance par Sébastien Ros
Correspondances entre le modèle objet et le modèle relationnel • Relation • relation 1-1 Modele Objet Modele relationnel il suffit d’ajouter à la table Customer, un champ qui contiendra la valeur du champ ID d’un enregistrement de la table Address. Il s’agit donc d’une clé étrangère. Document Mapping objet-relationnel, Couches d’accès aux données etFrameworks de persistance par Sébastien Ros
Correspondances entre le modèle objet et le modèle relationnel • relation 1-* Modele Objet Modele relationnel La table Order possède autant de champs que la classe Order possède d’attributs plus un champ ID et la clé étrangère pour référencer l’objet de type Customer qui le possède. Document Mapping objet-relationnel, Couches d’accès aux données etFrameworks de persistance par Sébastien Ros
Correspondances entre le modèle objet et le modèle relationnel • relation *-* Modele relationnel Modele Objet Cette table d’index est composée d’une clé primaire et de deux clés étrangères, qui référencent les deux objets en relation. Document Mapping objet-relationnel, Couches d’accès aux données etFrameworks de persistance par Sébastien Ros
LA solution (Java) : Hibernate HIBERNATE - Relational Persistence for Idiomatic Java
Hibernate • Hibernate a été écrit sous la responsabilité de Gavin King qui fait partie de l'équipe JBoss. • De plus en plus populaire, Hibernate est devenu le standard de facto de mapping objet-relationnel du monde Open Source (Free / open source, Hibernate est sous licence LGPL (Lesser GNU Public License)).Il possède une API personnalisée qui permet une meilleure flexibilité.
Hibernatekeyfeatures: • Modèle de programmation - Hibernate supporte les concepts de la POO ; Héritage, polymorphisme, composition.. et le Java collections framework • Support d’un modèle objet à fine granularité - une riche varieté de mappings de collections et d’objects • Extreme scalability - Hibernate est extremement performant, possède une architecture à double niveau. • Le langage de requête - Hibernate résout les deux parties du problème : non seulement comment stocker des objets dans une base de données mais aussi comment les en extraire. • EJB 3.0 - Hibernate implémente la persistance API et le langage de requêtes de persistance défini par EJB 3.0 (JSR-220).
Architecture Architecture haut niveau d’Hibernate. Ce diagramme montre qu’Hibernate utilise une base de données et une certaine configuration des données pour offrir des services de persistances(objets persistants) à l’application.
Application Transient Object Persistant Object Transaction SessionFactory Session TransactionFactory ConnectionProvider JTA JNDI JDBC Base de données Architecturedétaillée
Définitions Application Transient Object Persistant Object Transaction SessionFactory Session Transaction Factory ConnectionProvider JTA JNDI JDBC Base de données • SessionFactory (org.hibernate.SessionFactory) Un cache threadsafe (immuable) des mappings vers une (et une seule) base de données.C’est une « fabrique » de Session et c’est un client du ConnectionProvider. Peut contenir un cache optionnel de données (de second niveau) qui est réutilisable entre les différentes transactions que cela soit au niveau processus ou au niveau cluster.
Définitions Application Transient Object Persistant Object Transaction SessionFactory Session Transaction Factory ConnectionProvider JTA JNDI JDBC Base de données • Session (org.hibernate.Session) Un objet mono-threadé, à durée de vie courte, qui représente une conversation entre l'application et l'entrepôt de persistance. Encapsule une connexion JDBC. Factory (fabrique) des objets Transaction. Contient un cache (de premier niveau) des objets persistants, ce cache est obligatoire. Il est utilisé lors de la navigation dans le graphe d'objets ou lors de la récupération d'objets par leur identifiant.
Définitions Application Transient Object Persistant Object Transaction SessionFactory Session Transaction Factory ConnectionProvider JTA JNDI JDBC Base de données • Persistent objects and collections Objets à courte vie contenant l'état de persistance et la fonction métier. Ils sont en général les objets de type JavaBean (ou POJOs) ; la seule particularité est qu'ils sont associés avec une (et une seule) Session. Dès que la Session est fermée, ils seront détachés et libre d'être utilisés par n'importe laquelle des couches de l'application.
Définitions Application Transient Object Persistant Object Transaction SessionFactory Session Transaction Factory ConnectionProvider JTA JNDI JDBC Base de données • Transient and detached objects and collections Instances de classes persistantes qui ne sont actuellement pas associées à une Session. Elles ont pu être instanciées par l'application et ne pas avoir (encore) été persistées ou elle ont pu être instanciées par une session fermée.
Définitions Application Transient Object Persistant Object Transaction SessionFactory Session Transaction Factory ConnectionProvider JTA JNDI JDBC Base de données • Transaction (org.hibernate.Transaction) (Optionel)Un objet mono-threadé à vie courte utilisé par l'application pour définir une unité de travail atomique. Abstrait l'application des transactions sous-jacentes qu'elles soient JDBC, JTA ou CORBA. Une Session peut fournir plusieurs Transactions dans certain cas.
Définitions Application Transient Object Persistant Object Transaction SessionFactory Session Transaction Factory ConnectionProvider JTA JNDI JDBC Base de données • ConnectionProvider (org.hibernate.connection.ConnectionProvider) (Optionel) Une fabrique de (pool de) connexions JDBC. Abstrait l'application de la Datasource ou du DriverManager sous-jacent. Non exposé à l'application, mais peut être étendu/implémenté par le développeur.
Définitions Application Transient Object Persistant Object Transaction SessionFactory Session Transaction Factory ConnectionProvider JTA JNDI JDBC Base de données • TransactionFactory (org.hibernate.TransactionFactory) (Optionel) Une fabrique d'instances de Transaction. Non exposé à l'application, mais peut être étendu/implémenté par le développeur.
Fonctionnement d’Hibernate • Pas de modification du Byte Code et pas de génération de code • Hibernate : Hibernate utilise les réflections du runtime pour déterminer les propriétés persistantes d’une classe
Mapping Hibernate • Le mapping Object/relational est défini habituellement dans un document XML. Le document de mapping est conçu pour être lisible et éditable. Le langage du mapping est orienté Java. .java .hbm.xml Mapping
Mapping Hibernate <hibernate-mapping schema="schemaName" (1) catalog="catalogName" (2) default-cascade="cascade_style" (3) default-access="field|property|ClassName" (4) default-lazy="true|false" (5) auto-import="true|false" (6) package="package.name" (7) /> L’élément <id> définit le mapping de l’identificateur de la classe à la colonne de la clé primaire. Définition de la classe Java utilisée pour générer l'identifiant unique des instances d'une classe persistante
Mapping Hibernate • Le mapping englobe également : • Les collections • Les associations • Les composants • L’héritage
Mapping & Xdoclet • XML n'est pas pour tout le monde, ainsi il y a d’autres alternatives pour définir l’O/R mapping des données dans Hibernate. • Beaucoup d’utilisateurs Hibernate préfèrent integrer le mapping dans le code source en utilisant XDoclet @hibernate.tags directement. @hibernate.class @hibernate.property
Types Hibernate • Entités et valeurs • Types de valeur basiques • Types de valeurs personnalisées
Entités et Valeurs • Pour comprendre le comportement des objets Java en tenant compte de la persistance, nous avons besoin de les classer en deux groupes: • Une entitéexiste indépendamment de tout autre objet qui la référence. Les entités doivent être sauvegardées et effacées explicitement. Elles supportent des références circulaires et partagées. • L'état persistant d'une entité consiste en une référence à d’autres entités et instances de type valeur. Les valeurs sont des primitives, collections (pas ce qui est à l'intérieur d'une collection), composants et certains objets immuables. Contrairement aux entités, les valeurs (en particulier collections et composants) sont persistées et effacées par reachability. Les valeurs n'ont aucune identité indépendante, donc ils ne peuvent pas être partagés par deux entités ou collections.
Types de valeurs personnalisées • Pour implementer un type personnalisé, implementer : • org.hibernate.UserType ou • org.hibernate.CompositeUserType <property name="twoStrings"type="org.hibernate.test.DoubleStringType"> <column name="first_string"/> <column name="second_string"/> </property>
HQL • Hibernate est équipé d’un langage de requête extrêmement puissant qui ressemble beaucoup à SQL. HQL est complètement orienté objet, supportant les notions d’héritage, polymorphisme et association... • Les requêtes sont sensibles à la casse, à l'exception de noms de classes Java et propriétés. • Quelques utilisateurs trouvent les requêtes avec les mot-clés majuscules plus lisibles, mais nous trouvons cette convention laide quand à intégrer dans du code Java.
Requêtes HQL • La requête Hibernate la plus simple est de la forme : from Shape qui retourne simplement toutes les instances de la classe shape. • La clause select sélectionne les objets et propriétés qui doivent être retournés dans le résultat de la requête. Soit : select x from Shape as abscisse
Requêtes HQL • Les requêtes HQL peuvent rendre les résultats de fonctions globales sur les propriétés même: select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat) from Cat cat • Vous pouvez utiliser des opérateurs arithmétiques, de la concaténation, et des fonctions SQL reconnues dans la clause select: select cat.weight + sum(kitten.weight) from Cat cat join cat.kittens kitten group by cat.id, cat.weight
Requêtes HQL • Les requêtes Hibernate peuvent nommer toute classe Java ou se connecter à la clause. La requête retournera les instances de toutes classes persistantes qui héritent cette classe. La requête suivante retournera tous les objets persistants: from java.lang.Object o
HQL vs. SQL • Si vous n'êtes pas toujours convaincus par tout ça, pensez combien est plus long et moins lisible la requête suivante serait dans SQL:
API Criteria • Hibernate propose une API (Criteria) pour exécuter des requêtes. • l'API d'interrogation par critère ‘Criteria’ : • Intuitive et extensible • moins puissante que l'HQL • ne supporte pas la projection ou l'aggrégation.
API Criteria • L'interface org.hibernate.Criteria représente une requête sur une classe persistante donnée. La Session fournit les instances de Criteria. Criteria crit = sess.createCriteria(Cat.class); crit.setMaxResults(50); List cats = crit.list(); • Un criterion (critère de recherche) est une instance de l'interface org.hibernate.expression.Criterion.La classe org.hibernate.expression.Expression définit des méthodes pour obtenir des types de Criterion pré définis. List cats = sess.createCriteria(Cat.class) .add( Expression.like("name", "Fritz%") ) .add( Expression.between("weight", minWeight, maxWeight) ) .list();
Native SQL • Il est également possible d’écrire les requêtes dans le dialecte SQL natif de la base de données. • Ceci est utile si on souhaite utiliser les fonctionnalités spécifiques de la base de données comme le mot clé CONNECT d'Oracle. • Cette fonctionnalité offre par ailleurs un moyen de migration plus propre et doux d'une application basée sur SQL/JDBC vers une application Hibernate. Query sqlQuery = sess.createSQLQuery("select {cat.*} from cats {cat}", "cat", Cat.class); sqlQuery.setMaxResults(50); List cats = sqlQuery.list();
Exemple d’application • Nous allons vous présenter une petite application mettant en œuvre hibernate sous Tomcat.
Outils Hibernate • D'autres outils directement fournis par le projet Hibernate sont distribués comme Extensions. Ce package inclus des outils pour les tâches suivantes : • Génération de source Java à partir d'un fichier de mapping (CodeGenerator, hbm2java) • Génération de fichiers de mapping à partir des classes java compilées ou à partir des sources Java marquées avec XDoclet (MapGenerator, class2hbm)
Outils Hibernate • Il y a d’autres outils externes qui fournissent un support Hibernate : AndroMDA Plugins Hibernate pour Eclipse
HiberClipse • C’est un plugin qui génère, depuis une connexion à une base de données des fichiers de mapping pour Hibernate. • Pour mieux expliquer le fonctionnement de cet outil, nous passons à une courte démonstration en suivant l’atelier que nous avons préparé.