Vous êtes sur la page 1sur 23

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.
Pour la couche présentation, on La trouve, par exemple, le très populaire Struts
technologie
respectant J2EEleet lesmodèle
frameworks MVCqui se de séparation du code, de
sont créés autour
l'interface et desoffrent beaucoup
données. Pour d'outils
ce type de couche, on trouve plus classiquement les
pour
JSP 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 SQL
métier

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. Ceux-
ci 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/hibernate-
configuration-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 -->
<property name="hbm2ddl.auto">create</property>
Hibernate - Y. Bekkers 23
23

Vous aimerez peut-être aussi