D´eveloppement Web - Object Relational Mapping and Hibernate
D´eveloppement Web - Object Relational
Mapping and Hibernate
Jean-Michel Richer [email protected]
http://www.info.univ-angers.fr/pub/richer
M1/M2 Informatique 2010-2011
1 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Plan
Plan
1Introduction
2JOBYME
3Hibernate
4Bibliographie
2 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Plan
ORM et Hibernate
Objectifs
•se familiariser avec l'ORM
•le mettre en oeuvre sans framework (jobyme)
•le mettre en oeuvre en utilisant Hibernate
3 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Introduction
Introduction
Introduction
4 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Introduction
Que'est-ce que l'ORM?
ORM
L'ORM ouObject Relational Mappinga pour but d'´etablir la
correspondance entre
•une table de la base de donn´ees
•et une classe du modele objet
5 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Introduction
Pourquoi l'ORM?
N´ecessit´e de l'ORM
•le modele logique des donn´ees est diff´erent du modele de
classe
•r´eutilisabilit´e du code pour effectuer les op´eration de base :
•DAO
•CRUD
6 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Introduction
Rappel CRUD
CRUD
ensemble des fonctionsa implanter dans un BD relationnelle :
Op´eration SQL
Create INSERT
Read (Retrieve)SELECT
Update UPDATE
Delete (Destroy)DELETE
7 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Introduction
Pourquoi l'ORM?
Comparaison Objet et Relationnel
La repr´esentation sous formeRelationnellen'entre pas en
correspondance avec la repr´esentationObjet
•Objet : notions d'h´eritageet depolymorphisme
•Objet : pas d'identiant (pointeur)
•Objet : les relationsn:msont mod´elis´ees par des
containers
8 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Introduction
ORM et Java
ORM et Java
Inconv´enients li´esa Java
•choix important de solutions et outils / API
•´evolution des API suivant les versions :
•difcult´e d'apprentissage
•difcult´e de conguration
9 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Introduction
ORM et Java
ORM, Java et JDBC
la JDBC (Java DataBase Connectivity) a apport´e une
standardisation au niveau de l'acces des bases de donn´ees,
mais:
•il faut´ecrire le code pour r´ealiser le CRUD
•et r´ealiser lemappingentre tables et objets
10 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Introduction
ORM et Java
Solutions existantes
•API standard: JDO (Java Data Objects + POJO)
•API: Hibernate + POJO
•API complexes: EJB Entity
Frameworks de persistance :http://fr.wikipedia.org
(Hibernate, Cayenne, EJB3, ...
11 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Introduction
ORM et Java
Comparaison JDO et Hibernate
•JDO est un standard et Hibernate une solution Open
Source
•JDO peut traiter la persistance des BD Objets ou XML
(possible depuis Hibernate 3)
•JDO propose un langage de requete JDOQL / HSQL
•JDO modie les POJO alors que ce n'est pas le cas
d'Hibernate
12 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Introduction
ORM et Java
JDO
•www.oracle.com
•http://db.apache.org/jdo/index.html
Hibernate
•http://www.hibernate.org/
13 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
JOBYME
JOBYME
14 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
JOBYME
D´enition JOBYME
•Java Orm BY ME
•tentative de g´en´eration automatique de l'ORM (Code Java
+ CRUD)
•lecture de la BD (MySQL) et g´en´eration du code
correspondant
15 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
Etude de cas
Etude de cas
On d´esire mod´eliser la relation : Client, Commande, Produit
(Customer, Command, Product).
16 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
Conventions de nommage
Conventions de nommage des entit´es
•tout en minuscule, s´eparation par caractere soulign´e ()
•table: meme nom que l'entit´e (customer)
•attributs: pr´ex´es par les 2 premiers caracteres de la
table et caractere soulign´e (cu)
•toujours un identiant (cuid)
•minimiser la longueur des champs
•faire en sorte que leurs noms soient explicites
17 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
Cas de la table commande
Cas de la table commande
champ role typeindex
coid identiantintegerPK
codate date cr´eationdate NX
cototalprice prix total oat
cocuid identiant clientintegerNX
18 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
Conventions de nommage
Conventions de nommage des relations n/m
•par ordre alphab´etique du nom des entit´es / tables
•nom : 4 premieres lettres de la premiere table, 4 premieres
lettres
•pr´exe : premieres lettres des entit´es
19 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
Cas de la relation commande / produit
Relation commande / produit : commprod
champ role typeindex
cpid identiant integerPK
cpcoididentiant commandeintegerNX
coprididentiant produitintegerNX
cpqty quantit´e integer
20 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
JOBYME
Installation de la base de donn´ees
Mettre en place la base de donn´eescommands.sqlsous
MySQL:
•nom de la base : commands
•identiant de connexion :commuser
•mot de passe :commpass
21 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
Mapping Objet / Relationnel
Mise en correspondance objet / tuple
r´ealis´ee au travers d'un chier de description destables
nomm´emapping.xmlplac´ea la racine du projet. On d´ecrit le
nom de la table et le nom de la classe associ´ee :
•table: nom de la table
•class: nom de la classe
•prefix: pr´exe du nom de table
22 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
Mapping Objet / Relationnel
Mise en correspondance relation / attribut
on d´ecrit ensuite lesrelations:
•type: type de relation (one-to-one, one-to-many)
•attribute: nom de l'attribut
•class: nom de la classe associ´ee
•crud: liste des op´erationsa effectuer
(create,retrieve*,update,delete)
(*) en cascade
23 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
Modele objet g´en´er´e
La classe Command
1public classCommandextendsPersistentObject
2implementsPersistentInterface {
3
4protectedintid;
5protected Stringdate;
6protectedintcuId;
7protectedfloattotalPrice;
8protectedintnbCmdlines;
9// relational elds
10protectedCustomer customer;
11protected List<Commprod>commprods;
12}
27 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
Modele objet g´en´er´e
La classe Customer
1public classCustomerextendsPersistentObject
2implementsPersistentInterface {
3
4protectedintid;
5protected StringfirstName;
6protected StringlastName;
7protected Stringemail;
8protected Stringpassword;
9protectedintrights;
10// relational elds
11protected List<Command>commands;
12}
28 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
Persistance
Mise en place de la persistance
29 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
Persistance
Mise en place de la persistance
30 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
JOBYME
Utilisation de JOBYME
Utiliser JOBYME
dans le r´epertoire du projet lancer : ant
•compile le g´en´erateur
•g´en´ere les classesa partir du chier de mapping
•lance un test sommaire
31 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Hibernate
Hibernate
32 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Hibernate
Hibernate
•framework ORM pour Java (BD Relationnelles et Objet)
•requetes pour CRUD (HQL Hibernate Query Language)
•utilisation des POJOs (Plain Old Java Objects)
•conguration au travers de chiers XML ou d'annotations
•tres fortement congurable
•tres difcilea matriser !
33 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Historique
Hibernate
•2001 par Gavin King, alternativea EJB2
•2003 version 2 qui devient un standard incontournable
•int´egration JBOSS (RedHat)
•2010 version 3 : annotations
34 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Mapping Hibernate
Utilisation des mappings
•par convention l'extension est.hbm.xml
•on d´enit un chier par classe / table
•placer le chier de mapping dans le meme r´epertoire que
le chier de classe
35 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Mapping Hibernate
chier MappingNomClasse.hbm.xml
•permet de faire le lien entre les champs de la table et ceux
de la classe
•doitetre d´eclar´e dans le r´epertoire de la classe
example Product
Product.hbm.xmld´eclar´e danscom.mysite.model
36 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Mapping Hibernate
Structure du mapping
1<hibernate-mappingpackage="PackageName">
2<class
3name="ClassName"
4table="tableName"
5 lazy="true|false"
6polymorphism="implicit|explicit"
7where="arbitrary sql where condition"
8rowid="rowid"
9 subselect="SQL expression"
10...
11>
12...
13</hibernate-mapping>
38 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Mapping Hibernate
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´ees
•autres parametresa d´enir selon la base de donn´ees et
l'environnement
39 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Mapping Hibernate
D´enition des champs de la table
•id: permet de d´enir l'identiant de la table
•property: champ simple
•composite-id: cl´e compos´ee
•timestamp: champ de type date/heure
40 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Mapping Hibernate
D´enition d'un identiant
•name: nom du champ de la classe
•type: integer, long, oat, string, character, timestamp,
binary, ...
•column: nom du champ dans la table
•generator: m´ethode de g´en´eration de l'identiant
42 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Mapping Hibernate
M´ethode de g´en´eration d'un identiant
•assigned: l'utilisateur est responsable de la g´en´eration
•native: la base de donn´ees est responsable de la
g´en´eration
43 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Mapping Hibernate
D´enition d'une propri´et´e
•name,type,column
•update,insert: indique que le champ doitetre ajout´e lors
d'une modication ou insertion (d´efauta vrai)
•formula: expression SQL qui permet de d´enir le champ
•lazy: acces aux objets associ´es
45 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Strat´egies de chargement
Fetching
•concerne le chargement des objets li´es par des relations
•probleme complexe pour assurer l'efcacit´e
Exemple : chargement d'un client
Faut-il charger toutes les commandes lors du chargement du
client ?
46 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Strat´egies de chargement
Fetching strategies
Hibernate d´enit 4 strat´egies de chargement
•Immediate
•Lazy : ne charge pas tout
•Eager : on sp´ecie quels objets doiventetre charg´es
•Batch
47 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Utiliser Hibernate
Utilisation de Hibernate
•d´enir un chier de conguration
•d´emarrer Hibernate requiert la cr´eation d'une
SessionFactory
48 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Fichier de conguration
Fichier de congurationhibernate.cfg.xml
•d´enit les parametres d'accesa la base de donn´ees
•d´enit ou trouver les chiers de mapping (ressource)
•doitetre plac´e dans le r´epertoiresrcdu projet
49 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
SessionFactory
classeHibernateUtil
•obtenir une instance deSessionFactory
•r´ealise l'initialisation de la connexion
51 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
HibernateUtil
HibernateUtil.java
1importorg.hibernate.SessionFactory;
2importorg.hibernate.cfg.Conguration;
3import staticjava.lang.System.err;
4
5public classHibernateUtil{
6private static nalSessionFactory sessionFactory;
7static{
8 try{
9 // Create the SessionFactory from hibernate.cfg.xml
10 sessionFactory = new Conguration().configure().buildSessionFactory()'
11 ;
12 }catch(Exceptionex){
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
20public staticSessionFactory getSessionFactory(){
21 returnsessionFactory;
22}
23}
52 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Librairies.jar
Librairies Hibernate
Mettre dans le r´epertoireWEB-INF/liboulib:
•l'ensemble des chiers de Hibernatelib/required
•ajouter´egalement slf4j-simple
http://www.slf4j.org/
53 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
HibernateUtil
Application
Mettre en place la conguration JAVA pour r´ealiser un test avec
Hibernate
54 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Hibernate et annotations
Annotations
Hibernate integre un m´ecanisme d'annotationqui permet de
remplacer les chiers de mapping par des commentaires dans
le code. L'objectif est de
•ne pas s´eparer le code Java du chier de mapping
•de manierea congurer Hibernate automatiquement
55 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Hibernate
Exemple d'annotations
Annotations
1importorg.hibernate.annotations.Index;
2@Entity
3@Table(name="ARTIST")
4@NamedQueries({
5@NamesQuery(name="com.oreilly.hh.artistByName" ,
6query="from Artist as artist where upper(artist.name)=upper(:n ame)")
7})
8public classArtist{
9@Id
10@Column(name="ARTISTID")
11@GeneratedValue(strategy=GenerationType.AUTO)
12private Integerid;
13
14@Column(name="NAME",nullable=false,unique=true)
15@Index(name="ARTISTNAME",columnNames={"NAME"})
16private Stringname;
17
18@ManyToMany
19@JoinTable(name="TRACKARTISTS",
20 joinColumns={@JoinColumn(name="TRACKID")},
21 inverseJoinColumns={@JoinColumn(name="ARTISTID")})
22private Set<Track>tracks;
23
24}
56 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Bibliographie
Bibliographie
Bibliographie
57 / 58
D´eveloppement Web - Object Relational Mapping and Hibernate
Bibliographie
Bibliographie, sitographie
•Hibernate Quickly, Patrick Peak, Nick Heudecker,
Manning, 2006
•Hibernate in Action, Christian Bauer, Gavin King,
Manning, 2005
•Harnessing Hibernate, James Elliot, Tim O'Brien, Ryan
Fowler,O'Reilly, 2008
•www.hibernate.org
58 / 58