Développement Web - Object Relational Mapping and Hibernate



Documents pareils
Tutoriel d installation de Hibernate avec Eclipse

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

La gestion de la persistance avec Hibernate. Hibernate et la gestion de persistance. La gestion de la persistance (1/2) Introduction

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

OpenPaaS Le réseau social d'entreprise

Compte Rendu d intégration d application

Création d une application JEE

Application web de gestion de comptes en banques

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

Programmer en JAVA. par Tama

Accès aux bases de données

DEVAKI NEXTOBJET PRESENTATION. Devaki Nextobjects est un projet sous license GNU/Public.

Introduction à JDBC. Accès aux bases de données en Java

Java et les bases de données

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

CREATION WEB DYNAMIQUE

Web Tier : déploiement de servlets

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

TP1 : Initiation à Java et Eclipse

PHP 5. La base de données MySql. A. Belaïd 1

Java DataBaseConnectivity

1. Installation d'un serveur d'application JBoss:

Applet pour visualiser les variables «automate» notifiées

Connexion à SQL Server 2005 à partir du serveur d application SJSAS 9 Utilisation d une interface JDBC

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Alfstore workflow framework Spécification technique

Bases de Données relationnelles et leurs systèmes de Gestion

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

HIBERNATE - Persistance relationnelle en Java standard

EJB. Karim Bouzoubaa Issam Kabbaj

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Programmation d application Bases de données avec Java

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Europa. Développement JEE 5. avec Eclipse. K a r i m D j a a f a r. A v e c l a c o n t r i b u t i o n d e O l i v i e r S a l v a t o r i

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

Mise en œuvre des serveurs d application

Présentation du module Base de données spatio-temporelles

Gestion de base de données

Information utiles. webpage : Google+ : digiusto/

Chapitre IX. L intégration de données. Les entrepôts de données (Data Warehouses) Motivation. Le problème

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

PHP 4 PARTIE : BASE DE DONNEES

Architecture JEE. Objectifs attendus. Serveurs d applications JEE. Architectures JEE Normes JEE. Systèmes distribués

Architecture Orientée Service, JSON et API REST

I. MySQL : Serveur et SGBD

I4 : Bases de Données

Bases de données relationnelles

Création et Gestion des tables

4. SERVICES WEB REST 46

les techniques d'extraction, les formulaires et intégration dans un site WEB

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Composants Logiciels. Le modèle de composant de CORBA. Plan

Exercices sur SQL server 2000

Auto-évaluation Aperçu de l architecture Java EE

1. Base de données SQLite

Bases de données et sites WEB

APIs de table pour SQL Server

SQL Historique

Hala Skaf-Molli. Nancy-Université 14 mai 2007

La base de données XML exist. A. Belaïd

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Olivier Mondet

République Algérienne Démocratique et Populaire. Université Abou Bakr Belkaid Tlemcen. Faculté des Sciences Département d Informatique

Le langage SQL (première partie) c Olivier Caron

Introduction à ElasticSearch

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Les bases de données

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

RAPPORT DE STAGE GWT PRISE EN MAIN SERVLET - TEST DES DAO TELOSYS PLUGIN ECLIPSE WIZARD DATASET TELOSYS

Auto-évaluation Programmation en Java

Réalisation d un couplage téléphonie-informatique pour la suite Novanet

Cedric Dumoulin (C) The Java EE 7 Tutorial

XML par la pratique Bases indispensables, concepts et cas pratiques (3ième édition)

Application BdD et JDBC. Introduction 1/28. I Dans tout les cas, une seule problématique. I Quelques alternatives :

EXA1415 : Annotations

Corrigé des exercices sur les références

Remote Method Invocation (RMI)

Héritage presque multiple en Java (1/2)

PROJET 1 : BASE DE DONNÉES REPARTIES

Génie Logiciel avec Ada. 4 février 2013

Guide d installation de SugarCRM Open Source version 4.5.1

Bases de données et sites WEB Licence d informatique LI345

Les BASES de DONNEES dans WampServer

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

Ingénierie Dirigée par les Modèles. Editeurs de modèles. (Eclipse Modeling Tools) Jean-Philippe Babau

Big Data. Cyril Amsellem Consultant avant-vente. 16 juin Talend

Historisation des données

1 Introduction et installation

Projet Java EE Approfondi

TP Programmation Java / JDBC / Oracle

Mysql. Les requêtes préparées Prepared statements

Transcription:

1 / 58 Développement Web - Object Relational Mapping and Jean-Michel Richer jean-michel.richer@univ-angers.fr http://www.info.univ-angers.fr/pub/richer M1/M2 Informatique 2010-2011

2 / 58 Plan Plan 1 Introduction 2 JOBYME 3 4 Bibliographie

3 / 58 Plan ORM et Objectifs se familiariser avec l ORM le mettre en oeuvre sans framework (jobyme) le mettre en oeuvre en utilisant

4 / 58 Introduction Introduction Introduction

5 / 58 Introduction Que est-ce que l ORM? ORM L ORM ou Object Relational Mapping a pour but d établir la correspondance entre une table de la base de données et une classe du modèle objet

6 / 58 Introduction Pourquoi l ORM? Nécessité de l ORM le modèle logique des données est différent du modèle de classe réutilisabilité du code pour effectuer les opération de base : DAO CRUD

7 / 58 Introduction Rappel CRUD CRUD ensemble des fonctions à implanter dans un BD relationnelle : Opération Create Read (Retrieve) Update Delete (Destroy) SQL INSERT SELECT UPDATE DELETE

8 / 58 Introduction Pourquoi l ORM? Comparaison Objet et Relationnel La représentation sous forme Relationnelle n entre pas en correspondance avec la représentation Objet Objet : notions d héritage et de polymorphisme Objet : pas d identifiant (pointeur) Objet : les relations n:m sont modélisées par des containers

9 / 58 Introduction ORM et Java ORM et Java Inconvénients liés à Java choix important de solutions et outils / API évolution des API suivant les versions : difficulté d apprentissage difficulté de configuration

10 / 58 Introduction ORM et Java ORM, Java et JDBC la JDBC (Java DataBase Connectivity) a apporté une standardisation au niveau de l accès des bases de données, mais : il faut écrire le code pour réaliser le CRUD et réaliser le mapping entre tables et objets

Introduction ORM et Java Solutions existantes API standard : JDO (Java Data Objects + POJO) API : + POJO API complexes : EJB Entity Frameworks de persistance : http://fr.wikipedia.org (, Cayenne, EJB3,... 11 / 58

12 / 58 Introduction ORM et Java Comparaison JDO et JDO est un standard et une solution Open Source JDO peut traiter la persistance des BD Objets ou XML (possible depuis 3) JDO propose un langage de requête JDOQL / HSQL JDO modifie les POJO alors que ce n est pas le cas d

13 / 58 Introduction ORM et Java JDO www.oracle.com http://db.apache.org/jdo/index.html http://www.hibernate.org/

14 / 58 JOBYME JOBYME JOBYME

JOBYME JOBYME Définition JOBYME Java Orm BY ME tentative de génération automatique de l ORM (Code Java + CRUD) lecture de la BD (MySQL) et génération du code correspondant 15 / 58

16 / 58 JOBYME Etude de cas Etude de cas On désire modéliser la relation : Client, Commande, Produit (Customer, Command, Product).

17 / 58 JOBYME Conventions de nommage Conventions de nommage des entités tout en minuscule, séparation par caractère souligné ( ) table : même nom que l entité (customer) attributs : préfixés par les 2 premiers caractères de la table et caractère souligné (cu ) toujours un identifiant (cu id) minimiser la longueur des champs faire en sorte que leurs noms soient explicites

18 / 58 JOBYME Cas de la table commande Cas de la table commande champ rôle type index co id identifiant integer PK co date date création date NX co total price prix total float co cu id identifiant client integer NX

19 / 58 JOBYME Conventions de nommage Conventions de nommage des relations n/m par ordre alphabétique du nom des entités / tables nom : 4 premières lettres de la première table, 4 premières lettres préfixe : premières lettres des entités

20 / 58 JOBYME Cas de la relation commande / produit Relation commande / produit : commprod champ rôle type index cp id identifiant integer PK cp co id identifiant commande integer NX co pr id identifiant produit integer NX cp qty quantité integer

21 / 58 JOBYME JOBYME Installation de la base de données Mettre en place la base de données commands.sql sous MySQL : nom de la base : commands identifiant de connexion : commuser mot de passe : commpass

22 / 58 JOBYME Mapping Objet / Relationnel Mise en correspondance objet / tuple réalisée au travers d un fichier de description des tables nommé mapping.xml placé à la racine du projet. On décrit le nom de la table et le nom de la classe associée : table : nom de la table class : nom de la classe prefix : préfixe du nom de table

23 / 58 JOBYME Mapping Objet / Relationnel Mise en correspondance relation / attribut on décrit ensuite les relations : type : type de relation (one-to-one, one-to-many) attribute : nom de l attribut class : nom de la classe associée crud : liste des opérations à effectuer (create,retrieve*,update,delete) (*) en cascade

24 / 58 JOBYME DTD du Mapping DTD Mapping Objet / Relationnel 1 <?xml version="1.0" encoding="utf-8"?> 2 <!ELEMENT mappings (mapping+) > 3 <!ELEMENT mapping (relation*) > 4 <!ATTLIST mapping table CDATA #REQUIRED > 5 <!ATTLIST mapping class CDATA #REQUIRED > 6 <!ATTLIST mapping prefix CDATA #REQUIRED > 7 <!ELEMENT relation EMPTY > 8 <!ATTLIST relation type CDATA #REQUIRED > 9 <!ATTLIST relation attribute CDATA #REQUIRED > 10 <!ATTLIST relation class CDATA #REQUIRED > 11 <!ATTLIST relation crud CDATA #REQUIRED > 12

25 / 58 JOBYME Exemple Customer, Command, Product

26 / 58 JOBYME Mapping Mapping Objet / Relationnel 1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE mappings SYSTEM "mappings.dtd"> 3 <mappings> 4 <mapping table="command" class="command" prefix="co"> 5 <relation type="one-to-one" attribute="customer" class="customer"' 6 crud="retrieve" /> 7 <relation type="one-to-many" attribute="commprods" class="commprod"' 8 crud="create,retrieve*,update,delete" /> 9 </mapping> 10 11 <mapping table="customer" class="customer" prefix="cu"> 12 <relation type="one-to-many" attribute="commands" class="command"' 13 crud="retrieve" /> 14 </mapping> 15 16 <mapping table="commprod" class="commprod" prefix="cp"> 17 <relation type="one-to-one" attribute="product" class="product"' 18 crud="retrieve" /> 19 </mapping> 20 21 <mapping table="product" class="product" prefix="pr" /> 22 </mappings> 23

27 / 58 JOBYME Modèle objet généré La classe Command 1 public class Command extends PersistentObject 2 implements PersistentInterface { 3 4 protected int id; 5 protected String date; 6 protected int cuid; 7 protected float totalprice; 8 protected int nbcmdlines; 9 // relational fields 10 protected Customer customer; 11 protected List<Commprod> commprods; 12 }

28 / 58 JOBYME Modèle objet généré La classe Customer 1 public class Customer extends PersistentObject 2 implements PersistentInterface { 3 4 protected int id; 5 protected String firstname; 6 protected String lastname; 7 protected String email; 8 protected String password; 9 protected int rights; 10 // relational fields 11 protected List<Command> commands; 12 }

29 / 58 JOBYME Persistance Mise en place de la persistance

30 / 58 JOBYME Persistance Mise en place de la persistance

31 / 58 JOBYME Utilisation de JOBYME Utiliser JOBYME dans le répertoire du projet lancer : ant compile le générateur génére les classes à partir du fichier de mapping lance un test sommaire

32 / 58

framework ORM pour Java (BD Relationnelles et Objet) requêtes pour CRUD (HQL Query Language) utilisation des POJOs (Plain Old Java Objects) configuration au travers de fichiers XML ou d annotations très fortement configurable très difficile à maîtriser! 33 / 58

Historique 2001 par Gavin King, alternative à EJB2 2003 version 2 qui devient un standard incontournable intégration JBOSS (RedHat) 2010 version 3 : annotations 34 / 58

35 / 58 Mapping Utilisation des mappings par convention l extension est.hbm.xml on définit un fichier par classe / table placer le fichier de mapping dans le même répertoire que le fichier de classe

36 / 58 Mapping fichier Mapping NomClasse.hbm.xml permet de faire le lien entre les champs de la table et ceux de la classe doit être déclaré dans le répertoire de la classe example Product Product.hbm.xml déclaré dans com.mysite.model

37 / 58 Mapping Modèle de déclaration 1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE hibernate-mapping 3 PUBLIC "-/// Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping package="com.commands.model"> 6 7 <class name="product" table="product"> 8 <id name="id" type="integer" column="pr id"> 9 <generator class="native"/> 10 </id> 11 <property name="label" column="pr label"/> 12 <property name="stock" type="int" column="pr stock"/> 13 <property name="price" type="float" column="pr price"/> 14 </class> 15 16 </hibernate-mapping> 17

38 / 58 Mapping Structure du mapping 1 <hibernate-mapping package="packagename"> 2 <class 3 name="classname" 4 table="tablename" 5 lazy="true false" 6 polymorphism="implicit explicit" 7 where="arbitrary sql where condition" 8 rowid="rowid" 9 subselect="sql expression" 10... 11 > 12... 13 </hibernate-mapping>

39 / 58 Mapping Structure du Mapping PackageName : nom du package ou se trouve la classe ClassName : nom de la classe Java tablename : nom de la table de la base de données autres paramètres à définir selon la base de données et l environnement

40 / 58 Mapping Définition des champs de la table id : permet de définir l identifiant de la table property : champ simple composite-id : clé composée timestamp : champ de type date/heure

41 / 58 Mapping Structure d un identifiant 1 <id 2 name="propertyname" 3 type="typename" 4 column="column name" 5 unsaved-value="null any none undefined id value" 6 access="field property ClassName"> 7 node="element-name @attribute-name element/@attribute." 8 9 <generator class="generatorclass"/> 10 </id> 11

Mapping Définition d un identifiant name : nom du champ de la classe type : integer, long, float, string, character, timestamp, binary,... column : nom du champ dans la table generator : méthode de génération de l identifiant 42 / 58

43 / 58 Mapping Méthode de génération d un identifiant assigned : l utilisateur est responsable de la génération native : la base de données est responsable de la génération

44 / 58 Mapping Structure d une propriété 1 <property 2 name="propertyname" 3 column="column name" 4 type="typename" 5 update="true false" 6 insert="true false" 7 formula="arbitrary SQL expression" 8 access="field property ClassName" 9 lazy="true false" 10 unique="true false" 11 not-null="true false" 12 index="index name" 13 unique key="unique key id" 14 length="l" 15 precision="p" 16 scale="s" 17 />

45 / 58 Mapping Définition d une propriété name, type, column update, insert : indique que le champ doit être ajouté lors d une modification ou insertion (défaut à vrai) formula : expression SQL qui permet de définir le champ lazy : accès aux objets associés

46 / 58 Stratégies de chargement Fetching concerne le chargement des objets liés par des relations problème complexe pour assurer l efficacité Exemple : chargement d un client Faut-il charger toutes les commandes lors du chargement du client?

47 / 58 Stratégies de chargement Fetching strategies définit 4 stratégies de chargement Immediate Lazy : ne charge pas tout Eager : on spécifie quels objets doivent être chargés Batch

Utiliser Utilisation de définir un fichier de configuration démarrer requiert la création d une SessionFactory 48 / 58

49 / 58 Fichier de configuration Fichier de configuration hibernate.cfg.xml définit les paramètres d accès à la base de données définit où trouver les fichiers de mapping (ressource) doit être placé dans le répertoire src du projet

50 / 58 Configuration d Fichier de configuration hibernate.cfg.xml 1 <hibernate-configuration> 2 <session-factory> 3 <!-- Database connection settings --> 4 <property name="connection.driver class">com.mysql.jdbc.driver<' 5 /property> 6 <property name="connection.url">jdbc:mysql://localhost:3306/commands<' 7 /property> 8 <property name="connection.username">commuser</property> 9 <property name="connection.password">commpass</property> 10 <!-- JDBC connection pool (use the built-in) --> 11 <property name="connection.pool size">1</property> 12 <!-- SQL dialect --> 13 <property name="dialect">org.hibernate.dialect.mysqldialect</property> 14 <!-- Enable s automatic session context management --> 15 <property name="current session context class">thread</property> 16 <!-- Disable the second-level cache --> 17 <property name="cache.provider class">org.hibernate.cache.' 18 NoCacheProvider</property> 19 <!-- Echo all executed SQL to stdout --> 20 <property name="show sql">true</property> 21 <mapping resource="com/mysite/model/command.hbm.xml"/> 22 </session-factory> 23 </hibernate-configuration> 24 25

SessionFactory classe Util obtenir une instance de SessionFactory réalise l initialisation de la connexion 51 / 58

52 / 58 Util Util.java 1 import org.hibernate.sessionfactory; 2 import org.hibernate.cfg.configuration; 3 import static java.lang.system.err; 4 5 public class Util { 6 private static final SessionFactory sessionfactory; 7 static{ 8 try { 9 // Create the SessionFactory from hibernate.cfg.xml 10 sessionfactory = new Configuration().configure().buildSessionFactory()' 11 ; 12 } catch (Exception ex) { 13 // Make sure you log the exception, as it might be swallowed 14 err.println("initial SessionFactory creation failed." + ex.getmessage(' 15 )); 16 throw new ExceptionInInitializerError(ex.getMessage()); 17 } 18 } 19 20 public static SessionFactory getsessionfactory() { 21 return sessionfactory; 22 } 23 }

53 / 58 Librairies.jar Librairies Mettre dans le répertoire WEB-INF/lib ou lib : l ensemble des fichiers de lib/required ajouter également slf4j-simple http://www.slf4j.org/

54 / 58 Util Application Mettre en place la configuration JAVA pour réaliser un test avec

55 / 58 et annotations Annotations intègre un mécanisme d annotation qui permet de remplacer les fichiers de mapping par des commentaires dans le code. L objectif est de ne pas séparer le code Java du fichier de mapping de manière à configurer automatiquement

56 / 58 Exemple d annotations Annotations 1 import org.hibernate.annotations.index; 2 @Entity 3 @Table(name="ARTIST") 4 @NamedQueries({ 5 @NamesQuery(name="com.oreilly.hh.artistByName", 6 query="from Artist as artist where upper(artist.name)=upper(:name)") 7 }) 8 public class Artist { 9 @Id 10 @Column(name="ARTIST ID") 11 @GeneratedValue(strategy=GenerationType.AUTO) 12 private Integer id; 13 14 @Column(name="NAME",nullable=false,unique=true) 15 @Index(name="ARTIST NAME",columnNames={"NAME"}) 16 private String name; 17 18 @ManyToMany 19 @JoinTable(name="TRACK ARTISTS", 20 joincolumns={@joincolumn(name="track ID")}, 21 inversejoincolumns={@joincolumn(name="artist ID")}) 22 private Set<Track> tracks; 23 24 }

57 / 58 Bibliographie Bibliographie Bibliographie

58 / 58 Bibliographie Bibliographie, sitographie Quickly, Patrick Peak, Nick Heudecker, Manning, 2006 in Action, Christian Bauer, Gavin King, Manning, 2005 Harnessing, James Elliot, Tim O Brien, Ryan Fowler, O Reilly, 2008 www.hibernate.org