Hibernate - Web Services 33

publicité
Chapitre 2
Persistance de données
De Hibernate au
standard JPA 1.0
Sommaire
Persistance : De Hibernate à la JPA
 Stratégies d'accès aux données
 Principes du mappage Objet/Relationnel
 Le Framework Hibernate 3
 La JPA 1.0 (Java Persistance API)
 Synthèse comparative
M.Romdhani, INSAT, Octobre 2008
2
Persistance : De Hibernate à la JPA
Critères de choix de la stratégie de
persistance
Les critères de choix sont :








La performance
La portabilité
L'indépendance vis à vis des bases de données
Prise en compte des relations
Facilités de développement
Technique de Caching
Le modèle de persistance (O/R mapping)
Migration
M.Romdhani, INSAT, Octobre 2008
3
Persistance : De Hibernate à la JPA
Stratégies de persistance
 JDBC plat avec objets ADO
 Framework de persistance du type Hibernate/JDO/Castor
 EJB Entity
 Avec persistance CMP
 Avec persistance BMP
 EJB Session avec JDBC
M.Romdhani, INSAT, Octobre 2008
4
Persistance : De Hibernate à la JPA
La persistance des objet
 La persistance d’objets désigne le fait que des objets
individuels peuvent survivre au processus de l’application.
 Ils peuvent être enregistrés dans un entrepôt de données et
récupérés par la suite.
 Le mappage Objet/Relationnel (ORM) désigne la persistance
automatisée et transparente d’objets dans une application Java
vers les tables d’une base de données relationnelle à l’aide des
méta données décrivant le mapping entre les objets et la base
de données.
M.Romdhani, INSAT, Octobre 2008
5
Gestion de la correspondance
objet/relationnel
Persistance : De Hibernate à la JPA
 30% du code java est consacré à gérer la mise en rapport
SQL/JDBC et la non correspondance entre le modèle objet et le
modèle relationnel
 Gestion des associations
 Correspondances de types
 Granularité
 Les outils et frameworks ORM réduisent grandement le code
qui permet cette correspondance et facilitent donc les
adaptations mutuelles des deux modèles.
M.Romdhani, INSAT, Octobre 2008
6
Persistance : De Hibernate à la JPA
ORM( Object Relationnel Mapping)
 C’est une technique de mapping d’une représentation des
données d’un modèle objet vers un modèle relationnel de base
de données et inversement.
 Quatre éléments constituant une solution ORM :
1. Une API pour effectuer les opérations CRUD (Create, Read,
Update, delete) de base sur les objets des classes persistantes.
2. Un langage ou une API pour spécifier des requêtes qui se
réfèrent aux classes et aux propriétés des classes.
3. Un système pour spécifier des métadonnées de mapping.
4. Une technique pour l’implémentation du mapping
objet/relationnel permettant d’interagir avec des objets
transactionnels pour effectuer des vérifications brutes,
rechercher des associations lâches et implémenter d’autres
fonctions d’optimisation.
M.Romdhani, INSAT, Octobre 2008
7
Persistance : De Hibernate à la JPA
ORM( Object Relationnel Mapping):
 Productivité
 Réduction sensiblement le temps de développement.
 Maintenabilité
 Utilisation d’un tampon entre les deux modèles pour isoler les
modifications mineurs de chaque modèle.
 Performance
 Utilisation d’un grand nombre d’optimisation.
M.Romdhani, INSAT, Octobre 2008
8
Persistance : De Hibernate à la JPA
Solution ORM: Hibernate
 Un framework Java de persistance

Permet de faire la correspondence des tables de base de
données relationnelle avec des objets java simples (POJO ou
«Plain Old Java Object»).
 Une fois la correspondance entre les deux mondes définie, le
programme Java peut manipuler toutes les données en utilisant
que des JavaBean, masquant totalement la base de données
sous-jacente et ses spécificités.
 Le framework assure le remplissage de ces objets et la
mise à jour de la base en se basant sur leur contenu.
 XML constitue le format de description de la
correspondance entre les tables relationnelles et les
classes Java.
M.Romdhani, INSAT, Octobre 2008
9
Persistance : De Hibernate à la JPA
Historique de Hibernate
 Novembre 2001: fondé par Gavin King.
 Juin 2003: hibernate 2.0 solution complète d’ORM.
 Août 2003: Intérêt du monde de l’entreprise grandissant.
 Octobre 2003: Hibernate rejoint JBoss.
 Juin 2004: Premier brouillon de la spec EJB3 inspiré
fortement d’Hibernate.
 Octobre 2005: NHibernate rejoint JBoss.
 Décembre 2005: Hibernate 3.1.
M.Romdhani, INSAT, Octobre 2008
10
Hibernate: Architecture
Persistance : De Hibernate à la JPA
 Hibernate utilise des API Java existantes dont JDBC, JTA (Java
Transaction API) et JNDI (Java Naming and Dictory Interface).
 JDBC fournit un niveau rudimentaire d’abstraction des fonctionnalités communes aux bases
de données relationnelles, ce qui permet à pratiquement toutes les bases de données dotées
d’un pilote JDBC d’être supportées par Hibernate. JNDI et JTA permettent à Hibernate d’être
intégré avec des serveurs d’applications J2EE.
M.Romdhani, INSAT, Octobre 2008
Architecture multicouches d’Hibernate
extrait du livre « Hibernate » de
11
Gavin King et Christian Bauer.
Persistance : De Hibernate à la JPA
Hibernate: Interfaces centrales
 Grâce à ces interfaces, on peut stocker et récupérer des objets
persistants et contrôler des transactions.
 Interface Session
 L’interface Session est l’interface principale utilisée pour les applications
Hibernate. Les instances de session sont légères et peu coûteuses à
créer et à détruire.
 C’est un objet mono-threadé, à durée de vie courte, qui représente
une conversation entre l'application et l'entrepôt de persistance.
 L’interface session est quelquefois appelée « gestionnaire de
persistance » car il s’agit également d’une interface pour les opérations
liées à la persistance comme le stockage et la récupération des objets.
 SessionFactory
 L’application obtient des instances Session à partir d’une
SessionFactory.
 La sessionFactory est loin d’être légère. Elle est destinée à être
partagée par de nombreux thread d’application. Il y a en général une
unique SessionFactory pour l’application entière.
M.Romdhani, INSAT, Octobre 2008
12
Persistance : De Hibernate à la JPA
Hibernate: Interfaces centrales
 Interface configuration:
 L’objet Configuration est utilisé pour configurer et amorcer Hibernate.
L’application utilise une instance configuration pour spécifier
l’emplacement de mapping et de propriétés spécifiques à Hibernate,
puis pour créer la SessionFactory.

Interfaces Query et Criteria:
 L’interface Query permet de faire porter des requêtes sur la base de
données et de contrôler la manière dont la requête est exécutée .
 Une instance Query est utilisée pour lier les paramètres de requête,
limiter le nombre de résultats retournés et enfin exécuter la requête.
 Les instances Query sont légères et ne peuvent pas être utilisées en
dehors de la Session qui les a crées.
 L’interface Creteria est très similaire, elle permet de créer et d’exécuter
des requêtes par critères orientés objet.
M.Romdhani, INSAT, Octobre 2008
13
Persistance : De Hibernate à la JPA
Hibernate: Interfaces centrales
 Interface Transaction :
 L’interface Transaction est une API optionnelle.
 C’est un objet mono-threadé à vie courte utilisé par l'application pour
définir une unité de travail.
 Elle abstrait le code de l'application de l’implémentation sous-jacentes
gérant les transactions qu'elles soient JDBC, JTA ou CORBA.
 Une Session peut fournir plusieurs Transactions dans certains cas.
M.Romdhani, INSAT, Octobre 2008
14
Persistance : De Hibernate à la JPA
Configuration de Hibernate
 La configuration d’Hibernate consiste à ajuster un certains nombre de
paramètres qui permettent d’optimiser le comportement à l’exécution
d’Hibernate.
 Il y a trois méthodes qui permettent de configurer Hibernate:
1. En utilisant un fichier hibernate.properties.
2. En utilisant une instance java.util.properties de manière
programmatique.
3. En utilisant un fichier de configuration XML.
M.Romdhani, INSAT, Octobre 2008
15
Persistance : De Hibernate à la JPA
Hibernate: hibernate.properties
 Exemple de fichier hibernate.properties pour une source de données
fournie par conteneur
le nom JNDI de la source
de données.
Hibernate.connection.datasource= java:/comp/env/jdbc/actionDB
Activation de l’intégration
avec JTA
Hibernate.transaction.factory-class=\net.sf.hibernate.transaction.
JTATransactionFactory
Localisation duTransactionManager
Hibernate.transaction.manager_lookup_class= \net.sf.hibernate.
transaction.JBOSSTransactionManagerLookup
Utilisation du dialect SQL
Hibernate.dialect = net.sf.hibernate.dialect.PostgreSQLDialect
M.Romdhani, INSAT, Octobre 2008
16
Persistance : De Hibernate à la JPA
Hibernate: hibernate.cfg.xml
 Un fichier de configuration XML peut être utilisé pour configurer
entièrement une SessionFactory.
 A la différence de hibernate.properties qui ne contient que des
paramètres de configuration, le fichier hibernate.cfg.xml peut également
spécifier l’emplacement des documents de mapping.
Configuration cfg=new configuration();
Cfg.addRessouce(« essai/exple.hbm.xml »);
Cfg.setProperties(System.getProperties());
SessionFactory sessions=cfg.buildSessionFactory();
M.Romdhani, INSAT, Octobre 2008
17
Persistance : De Hibernate à la JPA
Hibernate: hibernate.cfg.xml
<?xml version=‘1.0’ encoding=‘utf-8’?>
Type de document
<!DOCTYPE hibernate-configuration
PUBLIC "-Hibernate/Hibernate Configuration DTD//EN "
" http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd>
<hibernate-configuration>
<Session-factory name=" java:/hibernate/HibernateFactory ">
L’attribut name
<property name=" show_sql ">true</property>
<property name="connection.datasource ">
Java:/comp/env/jdbc/ActionDB </property>Les propriétés Hibernate
<property name=" dialect ">
Net.sf.hibernate.dialect.PostgreSQLDialect </property>
<property name=" transaction.manager_look_class">
Net.sf.hibernate.transaction.JBossTransactionManagerLookup </property>
<mapping ressource=" auction/Item.hbm.xml"/>
<mapping ressource=" auction/Category.hbm.xml"/> Documents de mapping
<mapping ressource=" auction/Bid.hbm.xml"/>
</session-factory>
</hibernate-configuration>
M.Romdhani, INSAT, Octobre 2008
18
Persistance : De Hibernate à la JPA
Hibernate: hibernate.cfg.xml
 La déclaration du type de document est utilisée par le parseur XML
pour valider ce document d’après la DTD de configuration d’Hibernate.
 L’attribut facultatif name équivaut à la propriété
hibernate.session_factory_name. Il est utilisé pour la liaison JNDI de la
SessionFactory.
 Les propriétés Hibernate peuvent être spécifiées sans le préfixe
hibernate. Les noms et les valeurs de propriétés sont identiques aux
propriétés de la configuration programmatique.
 Les documents de mapping peuvent être spécifiés en tant que
ressources d’application
M.Romdhani, INSAT, Octobre 2008
19
Persistance : De Hibernate à la JPA
Hibernate: hibernate.cfg.xml
 A présent Hibernate est prêt à être initialiser en utilisant:
SessionFactory sessions=new configuration( )
.configure( ).buildSessionFactory( );
 Mais, comment Hibernate savait-il où le fichier de configuration se
trouvait?
 Lorsque configure( ) est appelé, Hibernate cherche un fichier
nommé Hibernate.cfg.xml dans le CLASSPATH. Si on souhaite
utiliser un nom de fichier différent ou placer ce fichier de
configuration dans un sous-repertoire, on n’a qu’ajouter un chemin
à la méthode configure( ):
SessionFactory sessions=new configuration( )
.configure( ‘‘/hibernate-config/auction.cfg.xml’’)
.buildSessionFactory( );
M.Romdhani, INSAT, Octobre 2008
20
Persistance : De Hibernate à la JPA
Langage de requête d’Hibernate : HQL
 Fonctionnalités:
 La capacité à appliquer des restrictions aux propriétés d’objets
associés liés par référence.
 La capacité à trier les résultats de la requête
 La capacité à paginer les résultats
 L’agrégation avec group by, having et des fonctions d’agrégation
comme sum, min et max.
 Les jointures externes lors de la récupération de plusieurs objets
par ligne
M.Romdhani, INSAT, Octobre 2008
21
Persistance : De Hibernate à la JPA
Langage de requête d’Hibernate : HQL
 La capacité à appeler des fonctions SQL définies par l’utilisateur.
 Les sous requêtes (requêtes imbriqués).
 HQL est moins verbeux et plus lisible que la requête avec SQL.
 Exemple de requête avec SQL:
Le même en HQL
M.Romdhani, INSAT, Octobre 2008
22
Persistance : De Hibernate à la JPA
Hibernate: SQL natif
 L'un des objectifs d'Hibernate est de s'éloigner de la base de données.
Or, l'utilisation du SQL natif va à l'encontre de cet objectif. De ce point
de vue, le SQL natif est à éviter.
 Néanmoins, l'équipe du projet le conseille seulement de façon
exceptionnelle pour des points qui ont besoin d'utiliser une optimisation
spécifique à la base de données.
 Cette fonctionnalité offre un moyen de migration plus propre d'une
application basée sur SQL/JDBC vers une application Hibernate.
M.Romdhani, INSAT, Octobre 2008
23
Persistance : De Hibernate à la JPA
Le standard JPA 1.0
M.Romdhani, INSAT, Octobre 2008
24
Persistance : De Hibernate à la JPA
Un peu d’histoire …
Entity Beans EJB 1.0 -> 2.1
 Complexité
 La courbe d’apprentissage trop prononcée
 Modèle de programmation non-intuitif
 Performance
 Le coût pour effectuer certaines requêtes était hors de proportions,
le cycle de vie du container devenait un boulet
M.Romdhani, INSAT, Octobre 2008
25
Persistance : De Hibernate à la JPA
Un peu d’histoire …
 Les équipes IT se sont de plus en plus tourné vers d’autres
produits sur le marché:
 Hibernate
 Le plus répandu dans la communauté présentement. Toutefois, la responsabilité
de compatibilité avec différents serveurs d’application revient à la communauté.
 JDO
 Bien que JDO soit un standard, appuyé par la JSR 243 (JDO 2.0), cette
technologie a reçu bien peu d’appui.
 Produits commerciaux (ex. TopLink)
 API propriétaires, onéreux, non-standard …
 Ces trois solutions fonctionnent globalement suivant les mêmes principes :
 Des fichiers de mapping pour faire correspondre les tables aux classes java
 Des beans Java simples correspondant aux objets métiers : ceux sont ces beans que
manipule le développeur
 Une API de persistance qui permet de rendre persistant en base les beans métiers. On
retrouve généralement les mêmes verbes (insert, update, delete, get)
 Un langage de requêtes proche du SQL mais manipulant les propriétés des beans.
M.Romdhani, INSAT, Octobre 2008
26
Persistance : De Hibernate à la JPA
Les besoins

Clairement, 2 grands besoins se dégagèrent, répondant à
l’industrie et aux développeurs:
1. Avoir une API simple d’utilisation, attrayante pour les
développeurs, appliquant les techniques apprises des cadres
d’applications de la communauté open source.
2. Avoir un standard respecté par les fournisseurs de serveurs
d’applications.
M.Romdhani, INSAT, Octobre 2008
27
Persistance : De Hibernate à la JPA
L'orientation EJB 3.0
 Les spécifications des EJB 3.0 Entité et de Java Persistence API (JPA)
reprennent les grands mécanismes des solutions de mapping
relationnel/objet.
 Les différents fournisseurs ont décliné leur offre afin d’intégrer les
spécifications des EJB 3.0 Entité et JPA :
 Hibernate supporte les annotations EJB 3.0 et JPA : Hibernate 3.2 peut
être utilisé comme avant, ou bien servir d’implémentation aux EJB 3.0.
 Toplink est l’implémentation des EJB 3.0 Entité pour la solution Oracle
 On assiste donc semble-t-il à la fin du casse-tête du choix d’architecture de la
couche de persistance dans le monde Java : nous avons une interface normée
qui est supporté par les acteurs principaux et qui repose sur des solutions et
concepts déjà éprouvés.
M.Romdhani, INSAT, Octobre 2008
28
Persistance : De Hibernate à la JPA
Présentation de JPA
 JPA est un standard pour la persistance des objets Java
 L'API JPA est récente. Elle n'a été disponible qu'à partir du JDK 1.6.
 L'API de persistance est accessible en utilisant le paquetage Java
javax.persistence.
 La spécification JPA a été implémentée par les deux produits Toplink
et Hibernate.
M.Romdhani, INSAT, Octobre 2008
29
Persistance : De Hibernate à la JPA
Mapping Objet Relationnel
 La communication entre les mondes objet et relationnel suppose une
transformation pour adapter la structure des données relationnelles au
modèle objet.
M.Romdhani, INSAT, Octobre 2008
30
Persistance : De Hibernate à la JPA
Fichier
Fichier de
de configuration
configuration
 Un seul fichier de configuration XML
 Il est nécessaire d’indiquer au fournisseur de persistance comment il
peut se connecter à la base de données
 Ce fichier peut aussi comporter d’autres informations
M.Romdhani, INSAT, Octobre 2008
31
Persistance : De Hibernate à la JPA
Fichier de configuration
Déclaration du l’unité
<persistence
persistante
<persistence-unit name="ExpoJPA">
<provider>
oracle.toplink.essentials.PersistenceProvider
</provider>
<mapping-file> META-INF/orm.xml </mapping-file>
<class>
configurent la liaison
com.expose.jpa.Personne
JDBC avec la base de
</class>
données
<properties>
<property
name="toplink.jdbc.driver“ value="com.mysql.jdbc.Driver" >
</property>
<property
name="toplink.jdbc.url” value="jdbc:mysql://localhost:3306/expojpa">
</property>
<property
name="toplink.jdbc.user" value="root">
</property>
</properties>
</persistence-unit>
</persistence>
M.Romdhani, INSAT, Octobre 2008
32
Persistance : De Hibernate à la JPA
Les Entités
 Les classes dont les instances peuvent être persistantes sont
appelées des entités dans la spécification de JPA
 Le développeur indique qu’une classe est une entité en lui associant
l’annotation @Entity
 Il faut importer javax.Persistence.Entity dans les classes entités.
M.Romdhani, INSAT, Octobre 2008
33
Persistance : De Hibernate à la JPA
Cycle de vie d’une entité
M.Romdhani, INSAT, Octobre 2008
34
Persistance : De Hibernate à la JPA
Classes entités : Entity Class
 Une classe entité doit posséder un attribut qui représente la clé primaire
dans la BD (@Id)
 Elle doit avoir un constructeur sans paramètre protected ou public
 Elle ne doit pas être final
 Aucune méthode ou champ persistant ne doit être final
 Une entité peut être une classe abstraite mais elle ne peut pas être une
interface
M.Romdhani, INSAT, Octobre 2008
35
Persistance : De Hibernate à la JPA
Classes entités : Embedded Class
 Il existe des classes incorporées (embedded) dont les données n’ont
pas d’identité dans la BD mais sont insérées dans une des tables
associées à une entité persistante
 Par exemple, une classe Adresse dont les valeurs sont insérées dans
la table Employe
M.Romdhani, INSAT, Octobre 2008
36
Persistance : De Hibernate à la JPA
EntityManager
 Classe javax.persistence.EntityManager
 Le gestionnaire d’entités est l’interlocuteur principal pour le
développeur.
 Il fournit les méthodes pour gérer les entités :
 les rendre persistantes,
 les supprimer de la base de données,
 retrouver leurs valeurs dans la base,
 etc.
M.Romdhani, INSAT, Octobre 2008
37
Persistance : De Hibernate à la JPA
Cycle de vie d’un EntityManager
 La méthode createEntityManager() de la classe EntityManagerFactory
créé un Entity Manager
 L’Entity Manager est supprimé avec la méthode close() de la classe
EntityManager, il ne sera plus possible de l’utiliser ensuite.
M.Romdhani, INSAT, Octobre 2008
38
Persistance : De Hibernate à la JPA
Fabrique de l’EntityManager
 La classe Persistence permet d’obtenir une fabrique de gestionnaire
d’entités par la méthode createEntityManagerFactory
 2 variantes surchargées de cette méthode :
 1 seul paramètre qui donne le nom de l’unité de persistance (définie
dans le fichier persistence.xml)
 Un 2ème paramètre de type Map qui contient des valeurs qui vont
écraser les propriétés par défaut contenues dans persistence.xml
M.Romdhani, INSAT, Octobre 2008
39
Persistance : De Hibernate à la JPA
Méthodes de EntityManager
 void flush()
 Toutes les modifications effectuées sur les entités du contexte de persistance
gérées par l’EntityManager sont enregistrées dans la BD lors d’un flush du
GE
 Au moment du flush, l’EntityMnager étudie ce qu’il doit faire pour chacune
des entités qu’il gère et il lance les commandes SQL adaptées pour modifier
la base de données (INSERT, UPDATE ou DELETE)
 void persist(Object entité)
 Une entité nouvelle devient une entité gérée, l’état de l’entité sera
sauvegardé dans la BD au prochain flush ou commit
 void remove(Object entité)
 Une entité gérée devient supprimée, les données correspondantes seront
supprimées de la BD
M.Romdhani, INSAT, Octobre 2008
40
Persistance : De Hibernate à la JPA
Méthodes de EntityManager
 void lock(Object entité, LockModeType lockMode)
 Le fournisseur de persistance gère les accès concurrents aux données de la BD
représentées par les entités avec une stratégie optimiste, lock permet de
modifier la manière de gérer les accès concurrents à une entité
 void refresh(Object entité)
 L’EntityManager peut synchroniser avec la BD une entité qu’il gère en
rafraichissant son état en mémoire avec les données actuellement dans la BD.
 Utiliser cette méthode pour s’assurer que l’entité a les mêmes données que la
BD
 <T> T find(Class<T> classeEntité,Object cléPrimaire)
 La recherche est polymorphe : l'entité récupérée peut être de la classe passée
en paramètre ou d'une sous-classe (renvoie null si aucune entité n’a
l’identificateur passé en paramètre)
M.Romdhani, INSAT, Octobre 2008
41
Persistance : De Hibernate à la JPA
Relations
 4 types de relations à définir entre les entités de la JPA:




One to One
Many to One
One to Many
Many to Many
M.Romdhani, INSAT, Octobre 2008
42
Persistance : De Hibernate à la JPA
Relationship: Many to One
@Entity
@Table(name="EMP")
@Entity
public class Department {
public class Employee {
@Id
private int id;
@Id
private String dname;
private int id;
// getters & setters
...
@ManyToOne
@JoinColumn(name="DEPT_ID")
}
private Department d;
// getters & setters
EMP
ID
PK
}
DEPARTMENT
...
DEPT_ID
ID
FK
PK
M.Romdhani, INSAT, Octobre 2008
DNAME
43
Persistance : De Hibernate à la JPA
Relationship: One to Many
@Entity
@Table(name="EMP")
@Entity
public class Department {
public class Employee {
@Id
private int id;
@Id
private String dname;
private int id;
@ManyToOne
@JoinColumn(name="DEPT_ID")
@OneToMany(mappedBy="d")
private Collection<Employee> emps;
// getters & setters
...
private Department d;
}
// getters & setters
EMP
ID
PK
}
DEPARTMENT
...
DEPT_ID
ID
FK
PK
M.Romdhani, INSAT, Octobre 2008
DNAME
44
Persistance : De Hibernate à la JPA
Relationships: One to One
@Entity
@Table(name="EMP")
@Entity
public class ParkingSpace {
public class Employee {
@Id
private int id;
@Id
private int lot;
private int id;
private String location;
@OneToOne
@JoinColumn(name="P_SPACE")
@OneToOne(mappedBy="space")
private Employee emp;
// getters & setters
...
private ParkingSpace space;
}
// getters & setters
EMP
ID
PK
}
PARKINGSPACE
...
P_SPACE
ID
FK
PK
M.Romdhani, INSAT, Octobre 2008
LOT
LOCATION
45
Persistance : De Hibernate à la JPA
Relationships: Many to Many
@Entity
@Table(name="EMP")
@Entity
public class Project {
public class Employee {
@Id
private int id;
@Id
private String name;
private int id;
@ManyToMany(mappedBy="p")
private Collection<Employee> e;
@JoinTable(name="EMP_PROJ",
joinColumns=
// getters & setters
...
@JoinColumn(name="EMP_ID"),
inverseJoinColumns=
}
@ManyToMany
@JoinColumn(name="PROJ_ID"))
EMP_PROJ
EMP
ID
PK
private
p;
NAME Collection<Project>
SALARY
}
M.Romdhani, INSAT, Octobre 2008
PROJECT
EMP_ID
PROJ_ID
ID
PK,FK1
PK,FK2
PK
NAME
46
Persistance : De Hibernate à la JPA
Étapes
pour récupérer des données
Queries
 Il est possible de rechercher des données sur des critères plus
complexes que la simple identité
 Les étapes sont alors les suivantes :
1.
2.
3.
4.
Décrire ce qui est recherché (langage JPQL)
Créer une instance de type Query
Initialiser la requête (paramètres, pagination)
Lancer l’exécution de la requête
 La JPA introduit le JPQL (Java Persistence Query Language),
qui est, tout comme le EJBQL ou encore le HQL, un langage de
requête du modèle objet, basé sur SQL.
M.Romdhani, INSAT, Octobre 2008
47
Persistance : De Hibernate à la JPA
Interface Query
 Représente une requête
 Une instance de Query (d’une classe implémentant Query) est
obtenue par les méthodes
 createQuery,
 createNativeQuery ou
 createNamedQuery de l’interface EntityManager
M.Romdhani, INSAT, Octobre 2008
48
Persistance : De Hibernate à la JPA
Queries: NamedQueries
 Peut être mise dans n’importe quelle entité, mais on choisira le plus
souvent l’entité qui correspond à ce qui est renvoyé par la requête
 On peut sauvegarder des gabarits de requête dans nos entités.
 Ceci permet :
 La réutilisation de la requête
 D’externaliser les requête du code.
@Entity
@NamedQuery(name="myQuery", query="Select o from MyPojo o")
public class MyPojo { … }
public class MyService {
public void myMethod() {…
List results =
em.createNamedQuery("myQuery").getResultList();…
}}
M.Romdhani, INSAT, Octobre 2008
49
Persistance : De Hibernate à la JPA
Queries: NativeQueries
 Une façon de faire des requête en SQL natif.
 Sert principalement à avoir plus de contrôle sur les requêtes à la
base de donnée.
public class MyService {
public void myMethod() {
…
List results
= em.createNativeQuery(“SELECT * FROM
MyPojo“, MyPojo.class)
.getResultList();
…
}
}
M.Romdhani, INSAT, Octobre 2008
50
Persistance : De Hibernate à la JPA
Transactions
 2 façons de mettre en place les transactions:
 JTA
 En utilisant la Java Transaction API
 Resource-local
 En utilisant le modèle de transaction du persistence manager
 Les fournisseurs de persistance doivent supporter les
transactions locales à une ressource, mais ne sont pas obligés
de supporter les transactions JTA
 La démarcation des transactions est choisie par le développeur
 Les contextes de persistance peuvent couvrir plusieurs
transactions
M.Romdhani, INSAT, Octobre 2008
51
Persistance : De Hibernate à la JPA
Transactions:
Resource-local
 Tient compte uniquement de la transaction actuelle,
indépendamment du serveur d’application.
 En dehors d’un serveur d’applications, une application doit utiliser
l’interface javax.persitence.EntityTransaction pour travailler avec des
transactions locales à une ressource
 Une instance de EntityTransaction peut s’obtenir par la méthode
getTransaction() de EntityManager
public class MyServlet extends HttpServlet {
…
public void doGet(…) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// persistence operations …
em.getTransaction().commit();
em.close();
}}
M.Romdhani, INSAT, Octobre 2008
52
Persistance : De Hibernate à la JPA
Application server / persistence engine

Les serveurs d’application ont tous placé leurs pions en vue
de l’avènement de la JPA.

Chacun a intégré un persistence manager de leur choix:

JBoss AS
-> Hibernate EntityManager

BEA Weblogic 9.2
-> SolarMetric Kodo (OpenJPA!)

Sun GlassFish -> Oracle TopLink Essentials

Oracle 10g AS -> Oracle TopLink Essentials
M.Romdhani, INSAT, Octobre 2008
53
Persistance : De Hibernate à la JPA
Outils JPA

Open source




Eclipse 3.2.x et plus w/ DALI
NetBeans 5.5 et plus
Oracle JDeveloper
Commerciaux


BEA Workshop Studio (Eclipse++)
JBoss IDE (Eclipse++) gratuit
M.Romdhani, INSAT, Octobre 2008
54
Persistance : De Hibernate à la JPA
Comparaison Hibernate/JPA
 Points Communs
 Offrir des services de persistance
 Mappage Objet/Relationnel déclaratif
 Adopter un langage de requêtes
 Points de divergence
 JPA est une brique de base du standard Java EE 5
 Hibernate est un Framework alors que JPA est une
spécification (API)
 Hibernate peut être utilisé comme fournisseur de persistance
 JPA utilise les annotations Java 5 pour assurer le mappage
 JPA est plus simple à mettre en œuvre que Hibernate
(Entity Manager, pas de fichiers de mappage, …)
M.Romdhani, INSAT, Octobre 2008
55
Téléchargement