Cours XML n°6 - fahmi

publicité
HIBERNATE
Mapping Objet / base de données relationnelle
2014 - 2015
1
Introduction
Les
applications
d'entreprises
s'orientent de plus en plus vers des
architectures
orientée
service. La
Pour la couche
présentation,
on trouve, par exemple, le très populaire
technologie
J2EE et les
Struts respectant
le frameworks
modèle MVC de séparation du code, de
qui
se sont
créés données.
autour offrent
l'interface
et des
Pour ce type de couche, on trouve plus
beaucoup
classiquement d'outils
les
JSPpour ou
les
trés
récentes
JSF
répondre aux besoins modernes.
qui permettraient de concurrencer directement le modèle initié par l'ASP.NET.
Nous allons, cependant, nous intéresser à une couche plus basse d'une
architecture applicative, la couche d'accès aux données.
Celle-ci permet d'interfacer le code métier avec une source de données.
L'intérêt
est
de
pouvoir
changer
de base de données en n'ayant besoin de ne modifier que la couche d'accès.
2
Introduction
Travailler dans les deux univers que sont l'orienté objet et la base
de données relationnelle peut être lourd et consommateur en temps
dans le monde de l'entreprise d'aujourd'hui.
Orienté objet
Hibernate
Base de données relationnelle
Hibernate est un outil de mapping objet/relationnel pour le monde
Java. Le terme mapping objet/relationnel (ORM) décrit la technique
qui consiste à faire le lien entre la représentation objet des données
et sa représentation relationnelle basée sur un schéma SQL.
3
Introduction
Sans Hibernate
Avec Hibernate
Mapping objet-relationnel
SGBD
SGBD
Logique
métier
SQL
Logique
métier
Transparence de la persistance
4
Introduction
Hibernate:
• S'occupe du Transfert des classes Java dans les tables de la
base de données.
• Il permet de interroger les données.
• Propose des moyens de les récupérer.
•
Il peut donc réduire de manière significative le temps de
développement qui aurait été autrement perdu dans une
manipulation manuelle des données via SQL et JDBC.
5
Objectif
• Le but d'Hibernate est de libérer le développeur de 95% des tâches
de programmation liées à la persistance des données communes.
• Il est le plus utile dans les modèles métier orientés objets dont la
logique métier est implémentée dans la couche Java dite
intermédiaire.
• Hibernate vous aidera à supprimer ou à encapsuler le code SQL
spécifique à votre base de données et vous aidera sur la tâche
commune qu'est la transformation des données d'une
représentation tabulaire à une représentation sous forme de
graphe d'objets.
6
Architecture
Une vue (très) haut niveau de l'architecture d'Hibernate
Ce diagramme montre Hibernate
utilisant une base de données et des
données de configuration pour fournir
un service de persistance (et des objets
persistants) à l'application.
7
Architecture
Hibernate est flexible et supporte différentes approches.
L'architecture légère laisse l'application fournir ses propres
connexions JDBC et gérer ses propres transactions.
• Cette approche utilise le minimum des APIs Hibernate
8
Architecture
L'architecture complète abstrait l'application des APIs JDBC/JTA
sous-jacentes et laisse Hibernate s'occuper des détails.
9
Définitions
SessionFactory (org.hibernate.SessionFactory)
Un cache threadsafe (immuable) des mappings vers une (et une seule) base de données. Une
factory (fabrique) de Session et un client de ConnectionProvider. Peut contenir un cache
optionnel de données (de second niveau) qui est réutilisable entre les différentes transactions
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.
Objets et Collections persistants
Objets mono-threadés à vie courte contenant l'état de persistance et la fonction métier. Ceuxci sont en général les objets de type JavaBean; 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 libres
d'être utilisés par n'importe laquelle des couches de l'application (ie. de et vers la présentation
en tant que Data Transfer Objects - DTO : objet de transfert de données).
10
Définitions
Transaction (org.hibernate.Transaction)
(Optionnel) 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 certains cas.
ConnectionProvider
(org.hibernate.connection.ConnectionProvider)
(Optionnel) Le fabriquant des 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.
11
Définitions
TransactionFactory (org.hibernate.TransactionFactory)
(Optionnel) Le fabriquant d'instances de Transaction. Non exposé à l'application, mais peut être
étendu/implémenté par le développeur.
Interfaces d'extension
Hibernate fournit de nombreuses interfaces d'extensions optionnelles que vous pouvez
implémenter pour personnaliser le comportement de votre couche de persistance.
• Dans une architecture légère, l'application n'aura pas à utiliser
les APIs Transaction/TransactionFactory et/ou n'utilisera pas
les APIs ConnectionProvider pour utiliser JTA ou JDBC.
12
Etats des instances
Une instance d'une classe persistante peut être dans l'un des trois états suivants, définis
par rapport à un contexte de persistance. L'objet Session d'hibernate correspond à ce
concept de contexte de persistance :
• passager (transient)
L'instance n'est pas et n'a jamais été associée à un contexte de persistance. Elle ne possède
pas d'identité persistante (valeur de clé primaire)
• persistant
L'instance est associée au contexte de persistance. Elle possède une identité persistante
(valeur de clé primaire) et, peut-être, un enregistrement correspondant dans la base. Pour un
contexte de persistance particulier, Hibernate garantit que l'identité persistante est équivalente
à l'identité Java (emplacement mémoire de l'objet)
• détaché
L'instance a été associée au contexte de persistance mais ce contexte a été fermé, ou l'instance
a été sérialisée vers un autre processus. Elle possède une identité persistante et peut-être un
enregistrement correspondant dans la base. Pour des instances détachées, Hibernate ne donne
aucune garantie sur la relation entre l'identité persistante et l'identité Java.
13
Intégration JMX
JMX est le standard J2EE de gestion des composants Java. Hibernate peut être géré
via un service JMX standard.
Si vous déployez Hibernate via JMX sur JBoss AS, vous aurez également les bénéfices
suivants :
Gestion de la session :
Le cycle de vie de la Session Hibernate peut être
automatiquement limitée à la portée d'une transaction JTA. Cela signifie que vous n'avez
plus besoin d'ouvrir et de fermer la Session manuellement, cela devient le travail de
l'intercepteur EJB de JBoss.
Déploiement HAR :
Habituellement vous déployez le service JMX Hibernate en
utilisant le descripteur de déploiement de Jboss, il supporte toutes les options de
configuration usuelles d'une SessionFactory Hibernate. Cependant, vous devez toujours
nommer tous vos fichiers de mapping dans le descripteur de déploiement. Si vous décidez
d'utiliser le déploiement optionnel sous forme de HAR, JBoss détectera automatiquement
tous vos fichiers de mapping dans votre fichier HAR.
14
Configuration
d'Hibernate
Description de la connexion
15
Configurer Hibernate
Il y a trois manières d’effectuer la configuration
d’Hibernate pour une application donnée :
Par programme
Par un fichier de propriétés hibernate.properties
Par un document xml hibernate.cfg.xml
16
(1) Configurer par programme
Une instance de
org.hibernate.cfg.Configuration
représente un ensemble de mappings des
classes Java d'une application vers la base de
données SQL.
Configuration cfg = new Configuration()
.addResource("Item.hbm.xml")
.addResource("Bid.hbm.xml");
17
(1) Configurer par programme
Éviter de câbler en dur dans le
programme les noms de fichiers
Configuration cfg = new Configuration()
.addClass(org.hibernate.auction.Item.class)
.addClass(org.hibernate.auction.Bid.class);
Hibernate va rechercher les fichiers de mappings
/org/hibernate/auction/Item.hbm.xml et
/org/hibernate/auction/Bid.hbm.xml dans
le classpath
18
(1) Configurer par programme
Préciser des propriétés de
configuration par programme
Configuration cfg = new Configuration()
.addClass(org.hibernate.auction.Item.class)
.addClass(org.hibernate.auction.Bid.class)
.setProperty("hibernate.dialect",
"org.hibernate.dialect.MySQLInnoDBDialect")
.setProperty("hibernate.connection.datasource
", "java:comp/env/jdbc/test")
.setProperty("hibernate.order_updates",
"true");
19
(2) Fichiers de propriétés
Ce n'est pas le seul moyen de passer des
propriétés de configuration à Hibernate. Les
différentes options sont :
1. Passer une instance de java.util.Properties à
Configuration.setProperties().
2. Placer hibernate.properties dans un répertoire
racine du classpath
3. Positionner les propriétés System en utilisant
java -Dproperty=value.
4. Inclure des éléments <property> dans le fichier
hibernate.cfg.xml
20
(3) Exemple de document
hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernateconfiguration-3.0.dtd">
<hibernate-configuration>
<session-factory>
...
</session-factory>
</hibernate-configuration>
21
(3) hibernate.cfg.xml
(1) connection à la base
<property name="connection.driver_class">
org.hsqldb.jdbcDriver
</property>
<property name="connection.url">
jdbc:hsqldb:film
</property>
<property name="connection.username">sa</property>
<property name="connection.password"></property>
22
hibernate.cfg.xml
(2) autres propriétés
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">
org.hibernate.dialect.HSQLDialect
</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">
org.hibernate.cache.NoCacheProvider
</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
Hibernate - Y. Bekkers
<property name="hbm2ddl.auto">create</property>
23
23
Téléchargement