persistance de données : jpa avec hibernateintroduction hibernate limites de l’api jdbc...

157
Persistance de donn´ ees : JPA avec Hibernate Achref El Mouelhi Docteur de l’universit ´ e d’Aix-Marseille Chercheur en programmation par contrainte (IA) Ing ´ enieur en g ´ enie logiciel [email protected] H & H: Research and Training 1 / 124

Upload: others

Post on 28-Jun-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Persistance de donnees : JPA avec Hibernate

Achref El Mouelhi

Docteur de l’universite d’Aix-MarseilleChercheur en programmation par contrainte (IA)

Ingenieur en genie logiciel

[email protected]

H & H: Research and Training 1 / 124

Page 2: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Plan

1 Introduction

2 Creation d’une connexion

3 Hibernate avec les fichiers de mapping

4 Hibernate avec les annotations JPAInsertionSelection selon l’identifiantModificationSuppressionSelection avec criteresAutres operations

5 Autres annotations JPA

H & H: Research and Training 2 / 124

Page 3: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Plan

6 SQL et HQL

7 Relation entre entitesOneToOneManyToOneOneToManyManyToManyInheritance

8 Classes incorporables

9 Methodes callback

10 Restructuration du code

H & H: Research and Training 3 / 124

Page 4: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Introduction

Hibernate

Limites de l’API JDBC

Necessite de formuler des requetes SQL

Logiques relationnelle et objet dans un meme fichier

Le developpeur doit tout ecrire et gerer : ouverture et fermeture deconnexion, gestion de transaction, preparation des requetes pourfaire le CRUD (Create, Read, Update, et Delete)...

Recuperation de resultats d’une requete SELECT dans un objetResultSet : pour le parcourir, il faut naviguer selon les lignes etles colonnes, case par case.

Une meilleure solution?

Utiliser un ORM...

H & H: Research and Training 4 / 124

Page 5: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Introduction

Hibernate

Limites de l’API JDBC

Necessite de formuler des requetes SQL

Logiques relationnelle et objet dans un meme fichier

Le developpeur doit tout ecrire et gerer : ouverture et fermeture deconnexion, gestion de transaction, preparation des requetes pourfaire le CRUD (Create, Read, Update, et Delete)...

Recuperation de resultats d’une requete SELECT dans un objetResultSet : pour le parcourir, il faut naviguer selon les lignes etles colonnes, case par case.

Une meilleure solution ?

Utiliser un ORM...

H & H: Research and Training 4 / 124

Page 6: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Introduction

Hibernate

Object-Relational Mapping (lien objet-relationnel)

une couche d’abstraction a la base de donnees

permet a l’utilisateur d’utiliser les tables d’une base de donneescomme des objets

consiste a associer :

une ou plusieurs classes a chaque table

un attribut de classe a chaque colonne de la table

a comme objectif de ne plus ecrire de requete SQL

supprime une tres grande partie du code necessaire avec JDBC

H & H: Research and Training 5 / 124

Page 7: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Introduction

Hibernate

ORM : avantages

Suppression d’une tres grande partie du code necessaire avec JDBC

Gain de temps

Simplification du code source

Code portable independant vis-a-vis de SGBD

ORM : inconvenients

Complexite (d’apprentissage)

Probleme d’optimalite pour les requetes complexes modifiant plusieurstuples

H & H: Research and Training 6 / 124

Page 8: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Introduction

Hibernate

ORM : avantages

Suppression d’une tres grande partie du code necessaire avec JDBC

Gain de temps

Simplification du code source

Code portable independant vis-a-vis de SGBD

ORM : inconvenients

Complexite (d’apprentissage)

Probleme d’optimalite pour les requetes complexes modifiant plusieurstuples

H & H: Research and Training 6 / 124

Page 9: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Introduction

Hibernate

Et JPA?

Java Persistence API

framework ORM pour Java

propose par JSR (Java Specification Requests)

ensemble d’interfaces standardise par Sun, qui permet l’organisation des donnees

facilitant la correspondance entre classe (Entity) et table (d’une base de donneesrelationnelle) : Mapping

s’appuyant sur

des annotations pour definir le lien entre Entity et table

un gestionnaire d’entite EntityManager pour persister les donnees

proposant un langage de requete adapte aux classes (JPQL : Java Persistence QueryLanguage)

H & H: Research and Training 7 / 124

Page 10: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Introduction

Hibernate

Remarque

JPA peut etre vu comme une interface (au sens programmationorientee-objet) qui necessite d’etre implemente.

Quelques frameworks ORM implementant les specifications JPA

Hibernate

EclipseLink

Java Data Objects (JDO)

ObjectDB

...

H & H: Research and Training 8 / 124

Page 11: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Introduction

Hibernate

Remarque

JPA peut etre vu comme une interface (au sens programmationorientee-objet) qui necessite d’etre implemente.

Quelques frameworks ORM implementant les specifications JPA

Hibernate

EclipseLink

Java Data Objects (JDO)

ObjectDB

...

H & H: Research and Training 8 / 124

Page 12: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Introduction

Hibernate

Hibernate

framework ORM (le premier) pour Java implementant lesspecifications de l’API JPA

Open-source

Cree par JBoss (Entreprise productrice de serveurs d’applicationJEE JBoss)

Possedant une extension NHibernate pour la plateforme .NET(de Microsoft)

Pouvant etre utilise dans tout type de projet Java (Web, Clientlourd...)

H & H: Research and Training 9 / 124

Page 13: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Introduction

Hibernate

Remarque

Pour definir une entite, Hibernate utilise

Soit un fichier de Mapping appele entity.hbm.xml

Soit des annotations JPA comme @Entity, @Id...

H & H: Research and Training 10 / 124

Page 14: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Introduction

Hibernate

Ajouter le plugin Hibernate a Eclipse

Dans le menu Help, choisir Eclipse Marketplace

Saisir Hibernate dans la zone de saisie et cliquer sur Go

Dans la liste, chercher JBoss Tools et lancer l’installation

Attendre la fin d’installation et redemarrer Eclipse

H & H: Research and Training 11 / 124

Page 15: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Introduction

Hibernate

Differentes etapes pour persister des donnees avec Hibernate

Preparer une connexion

Creer un projet (avec maven)

Ajouter les dependances pour Hibernate et MySQL Connectordans pom.xml

Creer le fichier de configuration hibernate.cfg.xml

Creer les entites

Persister les donnees

H & H: Research and Training 12 / 124

Page 16: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Creation d’une connexion

Hibernate

Avant de creer une connexion

creer une base de donnees hibernate

Telecharger JDBC 8.0.13

Aller surhttps://dev.mysql.com/downloads/file/?id=480292

Telecharger et Decompresser l’archive .zip

H & H: Research and Training 13 / 124

Page 17: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Creation d’une connexion

Hibernate

Avant de creer une connexion

creer une base de donnees hibernate

Telecharger JDBC 8.0.13

Aller surhttps://dev.mysql.com/downloads/file/?id=480292

Telecharger et Decompresser l’archive .zip

H & H: Research and Training 13 / 124

Page 18: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Creation d’une connexion

Hibernate

Creation d’une connexion a la base de donnees (hibernate)

Aller dans menu File ensuite New et enfin choisir Other

Chercher Connection Profile

Selectionner le SGBD (dans notre cas MySQL)

Attribuer un nom a cette connexion dans Name

Cliquer sur New Driver Definition devant la liste deroulante de Drivers

Definir le driver en choisissant le dernier MySQL JDBC DRIVER, en precisantson emplacement (chemin vers le Driver telecharge et decompresse) dans larubrique JAR List, en supprimant celui qui existait et en modifiant les donneesdans la rubrique Properties

Verifier ensuite l’URL, User name, Password et DataBase Name(hibernate) et Valider

H & H: Research and Training 14 / 124

Page 19: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Creation d’une connexion

Hibernate

Tester la connexion

Aller dans l’onglet Data Source Explorer

Faire un clic droit et ensuite choisir Connect

H & H: Research and Training 15 / 124

Page 20: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

Hibernate

Creer un projet maven

Aller dans menu File ensuite New et enfin choisir Mavenproject

Cliquer sur Next

Selectionner Internal dans la liste Catalog, choisirmaven-archetype-quickstart puis cliquer sur Next

Saisir

org.eclipse dans Group Id,

cours-hibernate dans Artifact Id et

org.eclipse.main dans Package

Cliquer sur Finish

H & H: Research and Training 16 / 124

Page 21: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernateAjouter une premiere dependance pour Hibernate dans pom.xml

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core-->

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.1.7.Final</version>

</dependency>

Ajouter une deuxieme pour le driver de MySQL

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency>

<groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version>

</dependency>

Pour mettre a jour ces dependances dans le projet, il faut faire Maven > Update Project

H & H: Research and Training 17 / 124

Page 22: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernateAjouter une premiere dependance pour Hibernate dans pom.xml

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core-->

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.1.7.Final</version>

</dependency>

Ajouter une deuxieme pour le driver de MySQL

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency>

<groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version>

</dependency>

Pour mettre a jour ces dependances dans le projet, il faut faire Maven > Update Project

H & H: Research and Training 17 / 124

Page 23: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernateAjouter une premiere dependance pour Hibernate dans pom.xml

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core-->

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.1.7.Final</version>

</dependency>

Ajouter une deuxieme pour le driver de MySQL

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency>

<groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version>

</dependency>

Pour mettre a jour ces dependances dans le projet, il faut faire Maven > Update Project

H & H: Research and Training 17 / 124

Page 24: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernateCreer le fichier de configuration hibernate.cfg.xml

Faire un clic droit sur src/main/java et aller dans New >Other

Chercher Hibernate puis selectionner HibernateConfiguration File (cfg.xml) et cliquer sur Next

Deux solutions possibles

Soit en cliquant sur Get values from Connection

Soit en remplissant le formulaire champ par champ

Quelle que soit la solution, il faut que la valeur choisie pourHibernate version correspond a celle de la dependance ajouteedans pom.xml

H & H: Research and Training 18 / 124

Page 25: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

Hibernate

Si on veut remplir le formulaire champ par champ

Choisir MySQL de la liste Database dialect

Selectionner le driver MySQL, com.mysql.cj.jdbc.Driver,de la liste Driver Class,

Choisir l’URL de connexionjdbc:mysql://<host><:port>/<database> deConnection URL et la remplacer parjdbc:mysql://localhost:3306/hibernate

Saisir le nom d’utilisateur dans Username et le mot de passedans Password

Valider et aller verifier les donnees dans le fichier XML genere

H & H: Research and Training 19 / 124

Page 26: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernateContenu du fichier hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd

"><hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">com.mysql.

jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://

localhost:3306/hibernate</property><property name="hibernate.connection.username">root</property

><property name="hibernate.connection.password">root</property

><property name="hibernate.dialect">org.hibernate.dialect.

MySQLDialect</property></session-factory>

</hibernate-configuration>

H & H: Research and Training 20 / 124

Page 27: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

Hibernate

Pour eviter les problemes SSL et l’incompatibilite avec l’heure de Paris, il faut ajouter

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">com.mysql.jdbc.

Driver</property><property name="hibernate.connection.url">

jdbc:mysql://localhost:3306/hibernate?useSSL=false&amp;serverTimezone=UTC

</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">root</property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect

</property></session-factory></hibernate-configuration>

H & H: Research and Training 21 / 124

Page 28: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

Hibernate

On peut aussi ajouter la propriete hbm2ddl.auto qui peut prendrecomme valeur

create : cree les tables, les donnees precedemment presentesdans les tables seront perdues.

update : met a jour les tables avec les valeurs donnees. si lestables ne sont pas presentes dans la base de donnees, ellesseront creees.

validate : si les tables ne sont pas presentes dans la base dedonnees, elles ne seront pas creees et une exception sera levee.

create-drop : creer les tables en detruisant les donneesprecedemment presentes. Les tables de la base de donneesseront aussi supprimees lorsque la SessionFactory est fermee (autiliser pour tester).

H & H: Research and Training 22 / 124

Page 29: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

Hibernate

Pour afficher les requetes SQL executees par Hibernate dans laconsole

On peut ajouter la propriete show sql qui prend soit true soitfalse

H & H: Research and Training 23 / 124

Page 30: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

Hibernate

Nouveau contenu du fichier hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">com.mysql.jdbc.

Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306

/hibernate</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">root</property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect

</property><property name="hbm2ddl.auto">update</property><property name="show_sql">true</property></session-factory></hibernate-configuration>

H & H: Research and Training 24 / 124

Page 31: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

Creons une classe Personne dans org.eclipse.model

public class Personne {private int num;private String nom;private String prenom;

public int getNum() {return num;

}public void setNum(int num) {

this.num = num;}public String getNom() {

return nom;}public void setNom(String nom) {

this.nom = nom;}public String getPrenom() {

return prenom;}public void setPrenom(String prenom) {

this.prenom = prenom;}

}

H & H: Research and Training 25 / 124

Page 32: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

Hibernate

Creer le fichier de configuration Personne.hbm.xml

Faire un clic droit sur src/main/java et aller dans New >Other

Chercher Hibernate

Selectionner Hibernate XML Mapping File (hbm.xml)puis cliquer sur Next

Choisir le package contenant les entites org.eclipse.model etsupprimer les autres puis cliquer sur Next

Valider et aller verifier les donnees dans le fichier XML genere

H & H: Research and Training 26 / 124

Page 33: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernateExemple de contenu du fichier Personne.hbm.xml

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD

3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2 ao?t 2018 06:34:34 by Hibernate Tools 3.5.0.Final --><hibernate-mapping>

<class name="org.eclipse.model.Personne" table="PERSONNE"><id name="num" type="int">

<column name="NUM" /><generator class="assigned" />

</id><property name="nom" type="java.lang.String">

<column name="NOM" /></property><property name="prenom" type="java.lang.String">

<column name="PRENOM" /></property>

</class></hibernate-mapping>

Remplacer <generator class="assigned" /> par <generator class="increment"/> pour que la cle primaire soit auto-incrementale.

H & H: Research and Training 27 / 124

Page 34: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

Hibernate

Nouveau contenu du fichier hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">com.mysql.jdbc.

Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306

/hibernate</property><property name="hibernate.connection.username">root</property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect

</property><property name="hbm2ddl.auto">update</property><property name="show_sql">true</property><mapping resource="org/eclipse/model/Personne.hbm.xml"/></session-factory></hibernate-configuration>

H & H: Research and Training 28 / 124

Page 35: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernateDepuis Java 9, il faut ajouter les dependances suivantes pourpouvoir parser le XML

<dependency><groupId>jakarta.xml.bind</groupId><artifactId>jakarta.xml.bind-api</artifactId><version>2.3.2</version>

</dependency>

<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.2</version>

</dependency>

Pour mettre a jour ces dependances dans le projet, il faut faire Maven> Update Project

H & H: Research and Training 29 / 124

Page 36: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernateDepuis Java 9, il faut ajouter les dependances suivantes pourpouvoir parser le XML

<dependency><groupId>jakarta.xml.bind</groupId><artifactId>jakarta.xml.bind-api</artifactId><version>2.3.2</version>

</dependency>

<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.2</version>

</dependency>

Pour mettre a jour ces dependances dans le projet, il faut faire Maven> Update Project

H & H: Research and Training 29 / 124

Page 37: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

Hibernate

Etapes

Pour persister des donnees, il faut

Creer un objet de configuration d’Hibernate

Utiliser cet objet pour charger le fichier de configuration hibernate.cfg.xml

Enregistrer la classe Personne dans l’objet de configuration

Creer une usine de gestionnaire d’entite (appelee EntityManagerFactory parEclipseLink et SessionFactory par Hibernate)

Creer un gestionnaire d’entite (appele EntityManager par EclipseLink et Session parHibernate)

[Demarrer une transaction]

Utiliser le gestionnaire de donnees pour persister les donnees

[Terminer la transaction et] fermer les differents flux

H & H: Research and Training 30 / 124

Page 38: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernatePour creer un objet de configuration

Configuration configuration = new Configuration();

Pour charger le fichier hibernate.cfg.xml (situe dans src/main/java)

configuration.configure();

Si le fichier hibernate.cfg.xml est situe dans un autre emplacement (par exemple,dans org.eclipse.model), il faut preciser son chemin

configuration.configure("org/eclipse/model/hibernate.cfg.xml");

On peut fusionner les deux etapes precedentes

Configuration configuration = new Configuration().configure();

H & H: Research and Training 31 / 124

Page 39: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernatePour creer un objet de configuration

Configuration configuration = new Configuration();

Pour charger le fichier hibernate.cfg.xml (situe dans src/main/java)

configuration.configure();

Si le fichier hibernate.cfg.xml est situe dans un autre emplacement (par exemple,dans org.eclipse.model), il faut preciser son chemin

configuration.configure("org/eclipse/model/hibernate.cfg.xml");

On peut fusionner les deux etapes precedentes

Configuration configuration = new Configuration().configure();

H & H: Research and Training 31 / 124

Page 40: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernatePour creer un objet de configuration

Configuration configuration = new Configuration();

Pour charger le fichier hibernate.cfg.xml (situe dans src/main/java)

configuration.configure();

Si le fichier hibernate.cfg.xml est situe dans un autre emplacement (par exemple,dans org.eclipse.model), il faut preciser son chemin

configuration.configure("org/eclipse/model/hibernate.cfg.xml");

On peut fusionner les deux etapes precedentes

Configuration configuration = new Configuration().configure();

H & H: Research and Training 31 / 124

Page 41: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernatePour creer un objet de configuration

Configuration configuration = new Configuration();

Pour charger le fichier hibernate.cfg.xml (situe dans src/main/java)

configuration.configure();

Si le fichier hibernate.cfg.xml est situe dans un autre emplacement (par exemple,dans org.eclipse.model), il faut preciser son chemin

configuration.configure("org/eclipse/model/hibernate.cfg.xml");

On peut fusionner les deux etapes precedentes

Configuration configuration = new Configuration().configure();

H & H: Research and Training 31 / 124

Page 42: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernateConstruire l’usine de gestionnaire d’entite a partir de l’objet de configuration

SessionFactory sessionFactory = configuration.buildSessionFactory();

Obtenir le gestionnaire d’entite

Session session = sessionFactory.openSession();

Demarrer une transaction

Transaction transaction = session.beginTransaction();

Inserer un objet dans la base de donnees

session.persist(personne);

Terminer la transaction et fermer les flux

transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 32 / 124

Page 43: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernateConstruire l’usine de gestionnaire d’entite a partir de l’objet de configuration

SessionFactory sessionFactory = configuration.buildSessionFactory();

Obtenir le gestionnaire d’entite

Session session = sessionFactory.openSession();

Demarrer une transaction

Transaction transaction = session.beginTransaction();

Inserer un objet dans la base de donnees

session.persist(personne);

Terminer la transaction et fermer les flux

transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 32 / 124

Page 44: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernateConstruire l’usine de gestionnaire d’entite a partir de l’objet de configuration

SessionFactory sessionFactory = configuration.buildSessionFactory();

Obtenir le gestionnaire d’entite

Session session = sessionFactory.openSession();

Demarrer une transaction

Transaction transaction = session.beginTransaction();

Inserer un objet dans la base de donnees

session.persist(personne);

Terminer la transaction et fermer les flux

transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 32 / 124

Page 45: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernateConstruire l’usine de gestionnaire d’entite a partir de l’objet de configuration

SessionFactory sessionFactory = configuration.buildSessionFactory();

Obtenir le gestionnaire d’entite

Session session = sessionFactory.openSession();

Demarrer une transaction

Transaction transaction = session.beginTransaction();

Inserer un objet dans la base de donnees

session.persist(personne);

Terminer la transaction et fermer les flux

transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 32 / 124

Page 46: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

HibernateConstruire l’usine de gestionnaire d’entite a partir de l’objet de configuration

SessionFactory sessionFactory = configuration.buildSessionFactory();

Obtenir le gestionnaire d’entite

Session session = sessionFactory.openSession();

Demarrer une transaction

Transaction transaction = session.beginTransaction();

Inserer un objet dans la base de donnees

session.persist(personne);

Terminer la transaction et fermer les flux

transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 32 / 124

Page 47: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

Placons toutes les instructions precedentes dans le main de App.java

package org.eclipse.main;

import org.eclipse.model.Personne;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;

public class App {public static void main( String[] args ) {

Personne personne = new Personne();personne.setNom("travolta");personne.setPrenom("john");Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();session.persist(personne);transaction.commit();session.close();sessionFactory.close();

}}

H & H: Research and Training 33 / 124

Page 48: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les fichiers de mapping

Hibernate

Constats

Une table personne a ete creee dans la base de donneeshibernate

Un tuple avec les valeurs (1,travolta,john) a ete inseredans la table personne

H & H: Research and Training 34 / 124

Page 49: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA

Hibernate

Avant de commencer

Supprimer le fichier de mapping Personne.hbm.xml

Remplacer <mappingresource="org/eclipse/model/Personne.hbm.xml"/>dans hibernate.cfg.xml par <mappingclass="org.eclipse.model.Personne" />

Supprimer et recreer la base de donnees hibernate

H & H: Research and Training 35 / 124

Page 50: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA

Hibernate

Ajoutons les annotations suivantes dans la classe Personne

package org.eclipse.model;

import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;

@Entitypublic class Personne {

@Id@GeneratedValue (strategy=GenerationType.IDENTITY)private int num;private String nom;private String prenom;

// + getters setters et toString

}

H & H: Research and Training 36 / 124

Page 51: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Insertion

HibernatePour ajouter un tuple dans la table personne

Personne personne = new Personne();personne.setNom("travolta");personne.setPrenom("john");Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();session.persist(personne);transaction.commit();session.close();sessionFactory.close();

Remarque

On peut remplacer <mapping class="org.eclipse.model.Personne" /> dehibernate.cfg.xml par configuration.addAnnotatedClass(Personne.class)

H & H: Research and Training 37 / 124

Page 52: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Insertion

HibernatePour ajouter un tuple dans la table personne

Personne personne = new Personne();personne.setNom("travolta");personne.setPrenom("john");Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();session.persist(personne);transaction.commit();session.close();sessionFactory.close();

Remarque

On peut remplacer <mapping class="org.eclipse.model.Personne" /> dehibernate.cfg.xml par configuration.addAnnotatedClass(Personne.class)

H & H: Research and Training 37 / 124

Page 53: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Insertion

Hibernate

On peut utiliser save pour recuperer la valeur de la cle primaire qui a eteattribuee au tuple ajoute dans la base de donnees

Personne personne = new Personne();personne.setNom("travolta");personne.setPrenom("john");Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Integer cle = (Integer) session.save(personne);transaction.commit();session.close();sessionFactory.close();System.out.println(cle);

H & H: Research and Training 38 / 124

Page 54: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Insertion

Hibernate

save Vs persist

save est une methode Hibernate tant dis que persist est une methode JPA

save retourne la valeur de la cle primaire attribuee au tuple

persist n’a pas de valeur de retour

save attribue l’identifiant au tuple immediatement (a l’execution d’insert)meme s’il n’est pas dans une transaction car il s’agit bien de sa valeur de retour

persist attribue l’identifiant au tuple a la fin de la transaction ou lorsqu’on faitun flush()

persist peut appliquer la persistance en cascade

persist et save permettent aussi de faire la modification si la cle de l’objet aajouter existe dans la base de donnees

H & H: Research and Training 39 / 124

Page 55: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Insertion

Hibernate

Si on n’avait pas declare l’entite Personne dans hibernate.cfg.xml(<mapping class="org.eclipse.model.Personne"></mapping>), on peut,ici, ajouter la ligne configuration.addAnnotatedClass(Personne.class)

Personne personne = new Personne();personne.setNom("travolta");personne.setPrenom("john");Configuration configuration = new Configuration().configure();configuration.addAnnotatedClass(Personne.class);SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();session.persist(personne);transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 40 / 124

Page 56: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Selection selon l’identifiant

Hibernate

Pour chercher une personne (avec load)

Configuration configuration = new Configuration().configure();

SessionFactory sessionFactory = configuration.buildSessionFactory();

Session session = sessionFactory.openSession();

Transaction transaction = session.beginTransaction();

Personne personne1 = session.load(Personne.class, 1);System.out.println(personne1);

transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 41 / 124

Page 57: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Selection selon l’identifiant

Hibernate

Pour chercher une personne (avec get)

Configuration configuration = new Configuration().configure();

SessionFactory sessionFactory = configuration.buildSessionFactory();

Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

Personne personne1 = session.get(Personne.class, 1);System.out.println(personne1);

transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 42 / 124

Page 58: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Selection selon l’identifiant

Hibernate

get vs load

Les deux font la meme chose

Avec get, Hibernate recupere immediatement l’objet de la basede donnees

Avec load, Hibernate recupere l’objet de la base de donneeslors de sa premiere utilisation

Si l’objet recherche n’existe pas, get retourne null tandis queload declenche une ObjectNotFoundException

H & H: Research and Training 43 / 124

Page 59: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Modification

Hibernate

Pour modifier une personne

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

Personne personne3 = session.get(Personne.class, 1);personne3.setNom("Abruzzi");

session.flush();

transaction.commit();session.close();sessionFactory.close();

La methode flush() ne prend pas de parametre. Donc elle envoie tous leschangements des entites managees dans la base de donnees

H & H: Research and Training 44 / 124

Page 60: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Modification

Hibernate

On peut aussi utiliser persist() ou save() pour enregistrer les modifications

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

Personne personne3 = session.get(Personne.class, 2);personne3.setNom("Abruzzi");

session.persist(personne3);

transaction.commit();session.close();sessionFactory.close();

Les methodes save(obj) et persist(obj) prennent en parametre l’objetmodifie et a sauvegarder dans la base de donnees

H & H: Research and Training 45 / 124

Page 61: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Modification

Hibernate

Si l’objet est detache (n’est pas attache a une session), le persister entraine sa creation etnon pas sa modification

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

Personne personne4 = new Personne();personne4.setNom("Denzel");personne4.setNum(1);personne4.setPrenom("Washington");

session.persist(personne4);

transaction.commit();session.close();sessionFactory.close();

Malgre l’existence de l’identifiant 1, un nouveau tuple sera cree avec un identifiantdifferent de 1 (pareil pour save())

H & H: Research and Training 46 / 124

Page 62: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Suppression

Hibernate

Pour supprimer une personne

Configuration configuration = new Configuration().configure();

SessionFactory sessionFactory = configuration.buildSessionFactory();

Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

Personne personne3 = session.get(Personne.class, 1);

session.delete(personne3);

transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 47 / 124

Page 63: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Selection avec criteres

Hibernate

Pour recuperer la liste de toutes les personnes

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

Criteria criteria = session.createCriteria(Personne.class);List<Personne> personnes = (List<Personne>) criteria.list();for(Personne personne : personnes)

System.out.println(personne);

transaction.commit();session.close();sessionFactory.close();

N’oublions pas d’ajouter toString() dans la classe Personne.

H & H: Research and Training 48 / 124

Page 64: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Selection avec criteres

Hibernate

Pour recuperer une liste de personnes selon un critere (ici le nom)

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

String string = "travolta";Criteria criteria = session.createCriteria(Personne.class);criteria = criteria.add(Restrictions.eq("nom", string));List<Personne> personnes = (List<Personne>) criteria.list();for(Personne personne : personnes)

System.out.println(personne);

transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 49 / 124

Page 65: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Autres operations

Hibernate

Autres methodes de la session

refresh(entity) : permet de synchroniser l’etat de l’entitepassee en parametre (entity) avec son etat en base dedonnees.

evict(entity) : permet de detacher l’entite passee enparametre (entity) de l’EntityManager qui la gere.

merge(entity) : permet d’attacher l’entite passee en parametre(entity), geree par un autre EntityManager, al’EntityManager courant.

H & H: Research and Training 50 / 124

Page 66: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Autres operations

Hibernate

Exemple avec utilisation de refresh()

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

//on suppose que John Wick avec un num 1 existe dans la BDPersonne p = session.load(Personne.class, 1);p.setNom("Travolta");session.refresh(p);System.out.println("le nom est " + p.getNom());// affiche le nom est Wick

transaction.commit();session.close();sessionFactory.close();// si on supprime session.refresh(p); Travolta sera affiche

H & H: Research and Training 51 / 124

Page 67: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Hibernate avec les annotations JPA Autres operations

HibernateExemple avec utilisation de evict()

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

// on suppose que John Wick avec un num 1 existe dans la BDPersonne p = session.load(Personne.class, 1);p.setNom("Travolta");session.evict(p); // p n’est plus gere par sessionsession.flush();transaction().commit();Personne p1 = session.load(Personne.class, 1);System.out.println("le nom est " + p1.getNom());

// affiche le nom est Wicksession.close();sessionFactory.close();

H & H: Research and Training 52 / 124

Page 68: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Autres annotations JPA

HibernateAutres annotations

Annotation designation@Entity permet de qualifier la classe comme entite@Id indique l’attribut qui correspond a la cle primaire de la table@Table decrit la table designee par l’entite@Column definit les proprietes d’une colonne@IdClass indique que l’entite annotee contient une cle composee

les champs constituant la cle seront annote par @Id@GeneratedValue s’applique sur les attributs annotes par @Id

permet la generation automatique de la cle primaire

// la classe Personne@IdClass(PersonnePK.class)@Entitypublic class Personne {@Idprivate String nom;@Idprivate String prenom;

// ensuite getters, setters etconstructeur

// la classe PersonnePKpublic class PersonnePK {@Idprivate String nom;@Idprivate String prenom;

// ensuite getters, setters,constructeur sans parametres etconstructeur avec deuxparametres nom et prenoms

H & H: Research and Training 53 / 124

Page 69: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Autres annotations JPA

HibernateAutres annotations

Annotation designation@Entity permet de qualifier la classe comme entite@Id indique l’attribut qui correspond a la cle primaire de la table@Table decrit la table designee par l’entite@Column definit les proprietes d’une colonne@IdClass indique que l’entite annotee contient une cle composee

les champs constituant la cle seront annote par @Id@GeneratedValue s’applique sur les attributs annotes par @Id

permet la generation automatique de la cle primaire

// la classe Personne@IdClass(PersonnePK.class)@Entitypublic class Personne {@Idprivate String nom;@Idprivate String prenom;

// ensuite getters, setters etconstructeur

// la classe PersonnePKpublic class PersonnePK {@Idprivate String nom;@Idprivate String prenom;

// ensuite getters, setters,constructeur sans parametres etconstructeur avec deuxparametres nom et prenoms

H & H: Research and Training 53 / 124

Page 70: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Autres annotations JPA

Hibernate

Attributs de l’annotation @Column

Attribut designationname permet de definir le nom de la colonne

s’il est different de celui de l’attributlength permet de fixer la longueur d’une chaıne de caracteresunique indique que la valeur d’un champ est uniquenullable precise si un champ est null (ou non)... ...

H & H: Research and Training 54 / 124

Page 71: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Autres annotations JPA

Hibernate

Attributs de l’annotation @Table

Attribut designationname permet de definir le nom de la table

s’il est different de celui de l’entiteuniqueConstraints permet de definir des contraintes d’unicite sur

un ensemble de colonnes

@Table(name="personne",uniqueConstraints={

@UniqueConstraint(name="nom_prenom", columnNames={"nom", "prenom"})

})

H & H: Research and Training 55 / 124

Page 72: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Autres annotations JPA

Hibernate

L’annotation @Transient

L’attribut annote par @Transient n’aura pas de colonne associeedans la table correspondante a l’entite en base de donnees.

H & H: Research and Training 56 / 124

Page 73: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

SQL et HQL

Hibernate

Creation de requetes

createSQLQuery() : permet d’executer une requete SQL

createNamedQuery() : permet d’executer une requete HQLdefinie par des annotations

createQuery() : permet d’executer une requete HQL

H & H: Research and Training 57 / 124

Page 74: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

SQL et HQL

Pour executer une requete SQL

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

String sqlRequete = "select * from Personne";SQLQuery query = session.createSQLQuery(sqlRequete);query.addEntity(Personne.class);

List<Personne> personnes = (List<Personne>) query.list();for(Personne personne : personnes)

System.out.println(personne);

transaction.commit();session.close();sessionFactory.close();

Sans query.addEntity(Personne.class), on ne peut faire le cast List<Personne> personnes = (List <Personne>) query.list()

H & H: Research and Training 58 / 124

Page 75: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

SQL et HQL

HibernateOn peut aussi executer une requete SQL parametree

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

String sqlRequete = "select * from Personne where nom = :nom";SQLQuery query = session.createSQLQuery(sqlRequete);query.addEntity(Personne.class);query.setParameter("nom", "Abruzzi");

List<Personne> personnes = (List<Personne>) query.list();for(Personne personne : personnes)

System.out.println(personne);

transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 59 / 124

Page 76: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

SQL et HQL

HibernateLes requetes nommees : exemple (on commence tout d’abord pardefinir la requete dans l’entite)

@Entity@NamedQuery(

name="findByNomPrenom",query="SELECT p FROM Personne p WHERE p.nom = :

nom and p.prenom = :prenom")public class Personne {

// le code precedent}

On peut importer NamedQuery dejavax.persistence.NamedQuery

H & H: Research and Training 60 / 124

Page 77: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

SQL et HQL

HibernateLes requetes nommees : exemple (ensuite nous l’utiliserons)

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

Query query = session.getNamedQuery("findByNomPrenom");query.setParameter("nom", "Abruzzi");query.setParameter("prenom", "John");

List<Personne> personnes = (List<Personne>) query.list();for(Personne personne : personnes)

System.out.println(personne);

transaction.commit();session.close();sessionFactory.close();

Il faut importer Query de org.hibernate.Query

H & H: Research and Training 61 / 124

Page 78: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

SQL et HQL

HibernateEt si on veut definir plusieurs requetes nommees

@Entity@NamedQueries({@NamedQuery(

name="findByNomPrenom",query="SELECT p FROM Personne p WHERE p.nom = :nom and p.

prenom = :prenom"),@NamedQuery(

name="findByPrenom",query="SELECT p FROM Personne p WHERE p.prenom = :prenom"

),})public class Personne {

// le code precedent}

C’est quoi le langage utilise dans la chaıne query?

H & H: Research and Training 62 / 124

Page 79: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

SQL et HQL

HibernateEt si on veut definir plusieurs requetes nommees

@Entity@NamedQueries({@NamedQuery(

name="findByNomPrenom",query="SELECT p FROM Personne p WHERE p.nom = :nom and p.

prenom = :prenom"),@NamedQuery(

name="findByPrenom",query="SELECT p FROM Personne p WHERE p.prenom = :prenom"

),})public class Personne {

// le code precedent}

C’est quoi le langage utilise dans la chaıne query?

H & H: Research and Training 62 / 124

Page 80: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

SQL et HQL

Hibernate

HQL : Hibernate Query Language

HQL est un langage de requetes pour les entites JPA defini parHibernate

Inspire du langage SQL mais adapte aux entites JPA

Permet de manipuler des entites et pas les tables d’une base dedonnees

Supporte des requetes de type select, update et delete

On manipule des entites et non pas des tables. Le nom des entites estsensible a la casse.

H & H: Research and Training 63 / 124

Page 81: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

SQL et HQL

Hibernate

HQL : Hibernate Query Language

HQL est un langage de requetes pour les entites JPA defini parHibernate

Inspire du langage SQL mais adapte aux entites JPA

Permet de manipuler des entites et pas les tables d’une base dedonnees

Supporte des requetes de type select, update et delete

On manipule des entites et non pas des tables. Le nom des entites estsensible a la casse.

H & H: Research and Training 63 / 124

Page 82: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

SQL et HQL

Hibernate

Utiliser HQL pour recuperer une liste de personnes ayant un nom = travolta

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

String hql = "select p from Personne p where nom = :nom";String string = "travolta";Query query = session.createQuery(hql);query.setParameter("nom", string);List<Personne> personnes = (List<Personne>) query.list();for(Personne personne : personnes)

System.out.println(personne);

transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 64 / 124

Page 83: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

SQL et HQL

Hibernate

Simplifier la requete precedente

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

String hql = "from Personne where nom = :nom";String string = "travolta";Query query = session.createQuery(hql);query.setParameter("nom", string);List<Personne> personnes = (List<Personne>) query.list();for(Personne personne : personnes)

System.out.println(personne);

transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 65 / 124

Page 84: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

SQL et HQL

Hibernate

Hibernate : documentation officielle (en francais)

https://docs.jboss.org/hibernate/orm/3.6/reference/fr-FR/html/index.html

H & H: Research and Training 66 / 124

Page 85: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites

Hibernate

Quatre (ou trois) relations possibles

OneToOne : chaque objet d’une premiere classe est en relationavec un seul objet de la deuxieme classe

OneToMany : chaque objet d’une premiere classe peut etre enrelation avec plusieurs objets de la deuxieme classe (lareciproque est ManyToOne)

ManyToMany : chaque objet d’une premiere classe peut etre enrelation avec plusieurs objets de la deuxieme classe etinversement

H & H: Research and Training 67 / 124

Page 86: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToOne

Hibernate

Avant de commencer

Supprimer et recreer la base de donnees hibernate

H & H: Research and Training 68 / 124

Page 87: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToOne

Hibernate

L’entite Adresse dans org.eclipse.model

@Entitypublic class Adresse {

@Idprivate String rue;private String codePostal;private String ville;

// + getters, setters et toString

}

H & H: Research and Training 69 / 124

Page 88: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToOne

HibernateModifier l’entite Personne@Entitypublic class Personne {

@Idprivate int num;private String nom;private String prenom;

@OneToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})@JoinColumn(name="rue", referencedColumnName="rue", nullable=false)

private Adresse adresse;

// + les getters/setters de chaque attribut

}

Appellation

Personne : entite proprietaire

Adresse : entite inverse

H & H: Research and Training 70 / 124

Page 89: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToOne

HibernateModifier l’entite Personne@Entitypublic class Personne {

@Idprivate int num;private String nom;private String prenom;

@OneToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})@JoinColumn(name="rue", referencedColumnName="rue", nullable=false)

private Adresse adresse;

// + les getters/setters de chaque attribut

}

Appellation

Personne : entite proprietaire

Adresse : entite inverse

H & H: Research and Training 70 / 124

Page 90: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToOne

Hibernate

@OneToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})

Explication

cascade : ici on cascade les deux operations PERSIST etREMOVE qu’on peut faire de l’entite proprietaire a l’entite inverse

On peut cascader d’autres operations telles que DETACH, MERGE,et REFRESH...

on peut cascader toutes les operations avec ALL

H & H: Research and Training 71 / 124

Page 91: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToOne

Hibernate

@JoinColumn(name="rue", referencedColumnName="rue",nullable=false)

Explication

Pour designer la colonne dans Adresse qui permet de faire lajointure

Pour dire que chaque personne doit avoir une adresse (donc onne peut avoir une personne sans adresse)

H & H: Research and Training 72 / 124

Page 92: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToOne

HibernateTestons l’ajout d’une personne

/* Adresse */Adresse adresse = new Adresse();adresse.setRue("Lyon");adresse.setCodePostal("13015");adresse.setVille("Marseille");/* Personne */Personne personne = new Personne();personne.setAdresse(adresse);personne.setNom("Ego");personne.setPrenom("Paul");/* Persistance */Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();session.persist(personne);transaction.commit();session.close();sessionFactory.close();

N’oublions pas de declarer l’entite Adresse dans hibernate.cfg.xml

H & H: Research and Training 73 / 124

Page 93: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToOne

Hibernate

Constats

Deux tables ont ete creees :

adresse avec les colonnes rue, codePostal, ville

personne avec les colonnes num, nom, prenom, #rue

Deux tuples ont ete inseres :

(Lyon, 13015, Marseille) dans adresse

(1, Ego, Paul, Lyon) dans personne

Remplacer persist() par save() et verifier que ca ne marche pas

H & H: Research and Training 74 / 124

Page 94: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToOne

Hibernate

Constats

Deux tables ont ete creees :

adresse avec les colonnes rue, codePostal, ville

personne avec les colonnes num, nom, prenom, #rue

Deux tuples ont ete inseres :

(Lyon, 13015, Marseille) dans adresse

(1, Ego, Paul, Lyon) dans personne

Remplacer persist() par save() et verifier que ca ne marche pas

H & H: Research and Training 74 / 124

Page 95: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToOne

HibernateTestons l’ajout avec save

Adresse adresse = new Adresse();adresse.setRue("Paradis");adresse.setCodePostal("13015");adresse.setVille("Marseille");

Personne personne = new Personne();personne.setAdresse(adresse);personne.setNom("Wick");personne.setPrenom("John");

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();session.save(adresse);session.save(personne);transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 75 / 124

Page 96: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToOne

Hibernate

Sans la precision suivante

@OneToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})

Il fallait persister l’objet adresse avant l’objet personne

Transaction transaction = session.beginTransaction();session.persist(adresse);session.persist(personne);transaction.commit();

H & H: Research and Training 76 / 124

Page 97: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToOne

Hibernate

Sans la precision suivante

@OneToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})

Il fallait persister l’objet adresse avant l’objet personne

Transaction transaction = session.beginTransaction();session.persist(adresse);session.persist(personne);transaction.commit();

H & H: Research and Training 76 / 124

Page 98: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToOne

HibernateExemple

Si on suppose que plusieurs personnes peuvent avoir la memeadresse

personne1

personne2

.

.

.

personneN

adresse

Many To OneH & H: Research and Training 77 / 124

Page 99: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToOne

Hibernate

Il faut juste changer

@ManyToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})

@JoinColumn(name="rue", referencedColumnName="rue",nullable=false)

Remarque

Le schema de la base de donnees ne change pas.

H & H: Research and Training 78 / 124

Page 100: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToOne

Hibernate

Il faut juste changer

@ManyToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})

@JoinColumn(name="rue", referencedColumnName="rue",nullable=false)

Remarque

Le schema de la base de donnees ne change pas.

H & H: Research and Training 78 / 124

Page 101: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToOne

Hibernate

Adresse adresse = new Adresse();adresse.setRue("New York");adresse.setCodePostal("13015");adresse.setVille("Marseille");Personne personne = new Personne();personne.setAdresse(adresse);personne.setNom("Messi");personne.setPrenom("Thiago");Personne personne2 = new Personne();personne2.setAdresse(adresse);personne2.setNom("Messi");personne2.setPrenom("Leo");Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();session.persist(personne);session.persist(personne2);transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 79 / 124

Page 102: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToMany

HibernateExempleSi on suppose qu’une personne peut avoir plusieurs adresses

adresse1

adresse2

.

.

.

adresseN

personne

One To Many

H & H: Research and Training 80 / 124

Page 103: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToMany

Hibernate

Il faut changer l’attribut adresse par une liste d’adresses

@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REMOVE})

private List <Adresse> adresses = new ArrayList <Adresse> ();

N’oublions pas de supprimer ce code de l’entite Personne

@OneToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})

@JoinColumn(name="rue", referencedColumnName="rue",nullable=false)

private Adresse adresse;// les getters/setters de chaque attribut

H & H: Research and Training 81 / 124

Page 104: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToMany

Hibernate

Il faut changer l’attribut adresse par une liste d’adresses

@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REMOVE})

private List <Adresse> adresses = new ArrayList <Adresse> ();

N’oublions pas de supprimer ce code de l’entite Personne

@OneToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})

@JoinColumn(name="rue", referencedColumnName="rue",nullable=false)

private Adresse adresse;// les getters/setters de chaque attribut

H & H: Research and Training 81 / 124

Page 105: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToMany

Hibernate

Ensuite

il faut generer le getter et le setter d’adresses

il faut aussi generer la methode add et remove qui permettentd’ajouter ou de supprimer une adresse pour un objet personne(Dans Source, choisir Generate Delegate Methods).

Renommer add en addAdresse et remove en removeAdresse

H & H: Research and Training 82 / 124

Page 106: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToMany

Hibernate

Avant de tester

Supprimer et recreer la base de donnees

H & H: Research and Training 83 / 124

Page 107: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToMany

Hibernate

Adresse a1 = new Adresse();a1.setRue("Estaque");a1.setCodePostal("13016");a1.setVille("Marseille");Adresse a2 = new Adresse();a2.setRue("Merlan");a2.setCodePostal("13013");a2.setVille("Marseille");Personne p1 = new Personne();p1.setNom("Wick");p1.setPrenom("John");p1.addAdresse(a1);p1.addAdresse(a2);Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();session.persist(p1);transaction.commit();session.close();sessionFactory.close();

H & H: Research and Training 84 / 124

Page 108: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToMany

Hibernate

Constats

Trois tables ont ete creees :

adresse avec les colonnes rue, codePostal, ville

personne avec les colonnes num, nom, prenom

personne adresse avec les colonnes#personne num, #adresses rue

Cinq tuples ont ete inseres :

(Estaque, 13016, Marseille) et (Merlan, 13013,Marseille) dans adresse

(1, Wick, John) dans personne

(1, Estaque) et (1, Merlan) dans personne adresse

H & H: Research and Training 85 / 124

Page 109: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToMany

Hibernate

On peut aussi definir si les objets de l’entite inverse (ici Adresse) serontcharges dans l’entite proprietaire (ici Personne). Il faut ajouter dansl’annotation l’attribut fetch :

@OneToMany(cascade={CascadeType.PERSIST, CascadeType.REMOVE},fetch = FetchType.CONSTANTE)

private List <Adresse> adresses = new ArrayList <Adresse> ();

Deux valeurs possibles pour CONSTANTE

EAGER : les objets de l’entite Adresse en relation avec un objet personne del’entite Personne seront charges immediatement.

LAZY (par defaut) : les objets de l’entite Adresse en relation avec un objetpersonne de l’entite Personne seront charges seulement lorsqu’ils sontdemandes (quand on fait personne.getAdresses()).

H & H: Research and Training 86 / 124

Page 110: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToMany

Hibernate

On peut aussi definir si les objets de l’entite inverse (ici Adresse) serontcharges dans l’entite proprietaire (ici Personne). Il faut ajouter dansl’annotation l’attribut fetch :

@OneToMany(cascade={CascadeType.PERSIST, CascadeType.REMOVE},fetch = FetchType.CONSTANTE)

private List <Adresse> adresses = new ArrayList <Adresse> ();

Deux valeurs possibles pour CONSTANTE

EAGER : les objets de l’entite Adresse en relation avec un objet personne del’entite Personne seront charges immediatement.

LAZY (par defaut) : les objets de l’entite Adresse en relation avec un objetpersonne de l’entite Personne seront charges seulement lorsqu’ils sontdemandes (quand on fait personne.getAdresses()).

H & H: Research and Training 86 / 124

Page 111: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToMany

HibernatePar defaut, c’est LAZY (rien a modifier dans l’entite Personne)

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Criteria criteria = session.createCriteria(Personne.class);List<Personne> personnes = (List<Personne>) criteria.list();for(Personne personne : personnes) {

System.out.println(personne);}session.close();sessionFactory.close();

Mettre le chargement a EAGER et tester

@OneToMany(cascade={CascadeType.PERSIST, CascadeType.REMOVE},fetch = FetchType.EAGER)

private List <Adresse> adresses = new ArrayList <Adresse> ();

H & H: Research and Training 87 / 124

Page 112: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToMany

HibernatePar defaut, c’est LAZY (rien a modifier dans l’entite Personne)

Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.

buildSessionFactory();Session session = sessionFactory.openSession();Criteria criteria = session.createCriteria(Personne.class);List<Personne> personnes = (List<Personne>) criteria.list();for(Personne personne : personnes) {

System.out.println(personne);}session.close();sessionFactory.close();

Mettre le chargement a EAGER et tester

@OneToMany(cascade={CascadeType.PERSIST, CascadeType.REMOVE},fetch = FetchType.EAGER)

private List <Adresse> adresses = new ArrayList <Adresse> ();

H & H: Research and Training 87 / 124

Page 113: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToMany

Hibernate

Remarque

Possible d’avoir des tuples dupliques avec le chargement EAGER

En effet, Hibernate fait une jointure interne sur la table de jointure(personne adresse) ce qui cause des eventuelles duplications(par exemple si une personne avait plusieurs adresses)

Nous pouvons rectifier le probleme de duplication en ajoutantl’annotation suivante

@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REMOVE}, fetch = FetchType.EAGER)

@Fetch(FetchMode.SELECT)private List <Adresse> adresses = new ArrayList <

Adresse> ();

H & H: Research and Training 88 / 124

Page 114: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites OneToMany

Hibernate

Remarque

Possible d’avoir des tuples dupliques avec le chargement EAGER

En effet, Hibernate fait une jointure interne sur la table de jointure(personne adresse) ce qui cause des eventuelles duplications(par exemple si une personne avait plusieurs adresses)

Nous pouvons rectifier le probleme de duplication en ajoutantl’annotation suivante

@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REMOVE}, fetch = FetchType.EAGER)

@Fetch(FetchMode.SELECT)private List <Adresse> adresses = new ArrayList <

Adresse> ();

H & H: Research and Training 88 / 124

Page 115: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

Hibernate

ExempleUne personne peut pratiquer plusieurs sportsUn sport peut etre pratique par plusieurs personnes

personne1

personne2

.

.

.

personneN

sport1

sport2

.

.

.

sportM

Many To ManyH & H: Research and Training 89 / 124

Page 116: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

Hibernate

Ce qu’il faut faire :

commencer par creer une entite Sport

definir la relation ManyToMany (exactement comme les deuxrelations precedentes) soit dans Personne soit dans Sport

H & H: Research and Training 90 / 124

Page 117: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

HibernateCreation de l’entite Sport

public class Sport {

@Idprivate String nom;private String type;public Sport() {

super();}public String getNom() {

return nom;}public void setNom(String nom) {

this.nom = nom;}public String getType() {

return type;}public void setType(String type) {

this.type = type;}

}

H & H: Research and Training 91 / 124

Page 118: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

HibernateAjoutons le ManyToMany dans la classe Personne

@Entitypublic class Personne {

// code precedent

@ManyToMany(cascade={CascadeType.PERSIST, CascadeType.REMOVE})private List <Sport> sports = new ArrayList <Sport> ();

public List<Sport> getSports() {return sports;

}public void setSports(List<Sport> sports) {

this.sports = sports;}public boolean addSport(Sport sport) {

return sports.add(sport);}public boolean removeSport(Sport sport) {

return sports.remove(sport);}

}

H & H: Research and Training 92 / 124

Page 119: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

HibernatePersonne p1 = new Personne();Personne p2 = new Personne();p1.setNom("Voight");p1.setPrenom("Bill");p2.setNom("Bob");p2.setPrenom("Joe");Sport s1 = new Sport();Sport s2 = new Sport();Sport s3 = new Sport();s1.setNom("football");s2.setNom("tennis");s3.setNom("box");s1.setType("collectif");s2.setType("individuel");s3.setType("collectif ou individuel");p1.addSport(s1);p1.addSport(s3);p2.addSport(s1);p2.addSport(s2);p2.addSport(s3);Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();session.persist(p1);session.persist(p2);transaction.commit();session.close();sessionFactory.close();

N’oublions pas de declarer l’entite Sport dans hibernate.cfg.xml

H & H: Research and Training 93 / 124

Page 120: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

Hibernate

Constats

Deux tables ont ete creees (sans compter les tables troisprecedentes) :

sport avec les colonnes nom, type

personne sport avec les colonnes#personne num, #sports nom

Dix tuples ont ete inseres :

(box, collectif ou individuel), (football,collectif) et (tennis, individuel) dans sport

(2, Voight, Bill) et (3, Bob, Joe) dans personne

(2, football), (2, box), (3, football), (3, tennis) et(3, box) dans personne sport

H & H: Research and Training 94 / 124

Page 121: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

HibernateSi la classe association est porteuse de donnees

Par exemple : la relation (ArticleCommande) entre Commande etArticle

Il faut preciser la quantite de chaque article dans une commande

Solution

Creer trois entites Article, Commande et ArticleCommande

Definir la relation OneToMany entre Article etArticleCommande

Definir la relation ManyToOne entre ArticleCommande etCommande

H & H: Research and Training 95 / 124

Page 122: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

HibernateSi la classe association est porteuse de donnees

Par exemple : la relation (ArticleCommande) entre Commande etArticle

Il faut preciser la quantite de chaque article dans une commande

Solution

Creer trois entites Article, Commande et ArticleCommande

Definir la relation OneToMany entre Article etArticleCommande

Definir la relation ManyToOne entre ArticleCommande etCommande

H & H: Research and Training 95 / 124

Page 123: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

Hibernate

Remarques

Les relations, qu’on a etudiees, sont unidirectionnelles

C’est a dire on peut faire personne.getSports();

Mais on ne peut faire sport.getPersonnes();

SolutionRendre les relations bidirectionnelles

H & H: Research and Training 96 / 124

Page 124: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

Hibernate

Remarques

Les relations, qu’on a etudiees, sont unidirectionnelles

C’est a dire on peut faire personne.getSports();

Mais on ne peut faire sport.getPersonnes();

SolutionRendre les relations bidirectionnelles

H & H: Research and Training 96 / 124

Page 125: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

Hibernate

Modifier l’entite inverse Sport

@Entitypublic class Sport {

@Idprivate String nom;private String type;

@ManyToMany(mappedBy="sports")private List <Personne> personnes = new ArrayList <Personne>

();// ajouter les getter, setter, add et remove

}

mappedBy

fait reference a l’attribut sports de la classe Personne

H & H: Research and Training 97 / 124

Page 126: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

HibernateNouveau code des methodes addSport et removeSport de la classe Personne

public void addSport(Sport sport) {sports.add(sport);sport.getPersonnes().add(this);

}

public void removeSport(Sport sport) {sports.remove(sport);sport.getPersonnes().remove(this);

}

Nouveau code des methodes addPersonne et removePersonne de la classe Sport

public void addPersonne(Personne personne) {personnes.add(personne);personne.getSports().add(this);

}

public void removePersonne(Personne personne) {personnes.remove(personne);personne.getSports().remove(this);

}

H & H: Research and Training 98 / 124

Page 127: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

HibernateNouveau code des methodes addSport et removeSport de la classe Personne

public void addSport(Sport sport) {sports.add(sport);sport.getPersonnes().add(this);

}

public void removeSport(Sport sport) {sports.remove(sport);sport.getPersonnes().remove(this);

}

Nouveau code des methodes addPersonne et removePersonne de la classe Sport

public void addPersonne(Personne personne) {personnes.add(personne);personne.getSports().add(this);

}

public void removePersonne(Personne personne) {personnes.remove(personne);personne.getSports().remove(this);

}

H & H: Research and Training 98 / 124

Page 128: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

Hibernate

Ainsi, on peut faire : (Supprimer et recreer la base de donnees)

// tout le code precedent du main +for (Personne personne : s1.getPersonnes())System.out.println(personne.getNom());

afficheVoightBob

H & H: Research and Training 99 / 124

Page 129: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

Hibernate

Ainsi, on peut faire : (Supprimer et recreer la base de donnees)

// tout le code precedent du main +for (Personne personne : s1.getPersonnes())System.out.println(personne.getNom());

afficheVoightBob

H & H: Research and Training 99 / 124

Page 130: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites ManyToMany

Hibernate

Pour definir une relation bidirectionnelle entre deux entites

si dans l’entite proprietaire la relation definie est OneToMany,alors dans l’entite inverse la relation sera ManyToOne, etinversement.

si dans l’entite proprietaire la relation definie est OneToOne, alorsdans l’entite inverse la relation sera aussi OneToOne.

si dans l’entite proprietaire la relation definie est ManyToMany,alors dans l’entite inverse la relation sera aussi ManyToMany.

H & H: Research and Training 100 / 124

Page 131: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites Inheritance

Hibernate

Trois possibilites avec l’heritage

SINGLE TABLE

TABLE PER CLASS

JOINED

Exemple

Une classe mere Personne

Deux classes filles Etudiant et Enseignant

H & H: Research and Training 101 / 124

Page 132: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites Inheritance

Hibernate

Trois possibilites avec l’heritage

SINGLE TABLE

TABLE PER CLASS

JOINED

Exemple

Une classe mere Personne

Deux classes filles Etudiant et Enseignant

H & H: Research and Training 101 / 124

Page 133: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites Inheritance

Hibernate

Pour indiquer comment transformer les classes mere et filles en tables

Il faut utiliser l’annotation @Inheritance

H & H: Research and Training 102 / 124

Page 134: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites Inheritance

Hibernate

Tout dans une seule table

Dans la classe mere on ajoute@Inheritance(strategy=InheritanceType.SINGLE TABLE)

H & H: Research and Training 103 / 124

Page 135: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites Inheritance

HibernateExemple

Et pour distinguer un etudiant d’un enseignant, d’une personne

@DiscriminatorColumn(name="TYPE PERSONNE") dans laclasse mere,

@DiscriminatorValue(value="PERS") dans la classePersonne,

@DiscriminatorValue(value="ETU") dans la classeEtudiant et

@DiscriminatorValue(value="ENS") dans la classeEnseignant.

Dans la table personne, on aura une colonne TYPE PERSONNE quiaura comme valeur soit PERS, soit ETU soit ENS.

H & H: Research and Training 104 / 124

Page 136: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites Inheritance

HibernateLa classe Personne

@Entity@Inheritance(strategy=InheritanceType.SINGLE_TABLE)@DiscriminatorColumn(name="TYPE_PERSONNE")@DiscriminatorValue(value="PERS")public class Personne {

// + tout le code precedent

}

La classe Etudiant

@Entity@DiscriminatorValue(value="ETU")public class Etudiant extends Personne {

private String niveau;

public String getNiveau() {return niveau;

}

public void setNiveau(String niveau) {this.niveau = niveau;

}}

La classe Enseignant

@Entity@DiscriminatorValue(value="ENS")public class Enseignant extends Personne {

private int salaire;

public int getSalaire() {return salaire;

}

public void setSalaire(int salaire) {this.salaire = salaire;

}}

H & H: Research and Training 105 / 124

Page 137: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites Inheritance

HibernateEt pour tester

/* Personne */Personne personne = new Personne();personne.setNom("Guardiola");personne.setPrenom("Pep");/* Enseignant */Enseignant enseignant = new Enseignant();enseignant.setNom("Ferguson");enseignant.setPrenom("Sir");enseignant.setSalaire(10000);/* etudiant */Etudiant etudiant = new Etudiant();etudiant.setNom("Mourinho");etudiant.setPrenom("Jose");etudiant.setNiveau("Ligue 1");/* Persistance */Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();session.persist(personne);session.persist(etudiant);session.persist(enseignant);transaction.commit();session.close();sessionFactory.close();

N’oublions pas de declarer les entites Etudiant et Enseignant dans hibernate.cfg.xml

H & H: Research and Training 106 / 124

Page 138: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites Inheritance

Hibernate

Constats

Trois colonnes ajoutees a la table personne :

TYPR PERSONNE

niveau

salaire

Trois tuples ajoutes avec les valeurs suivantes :

H & H: Research and Training 107 / 124

Page 139: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Relation entre entites Inheritance

Hibernate

Exemple avec une table pour chaque entite

@Inheritance(strategy=InheritanceType.TABLE PER CLASS) :Chaque entite sera transformee en table.

H & H: Research and Training 108 / 124

Page 140: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Classes incorporables

Hibernate

Les classes incorporables

Pas de table correspondante dans la base de donnees

Utilisee generalement par des entites

H & H: Research and Training 109 / 124

Page 141: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Classes incorporables

HibernateEt si on deplace les attributs nom et prenom dans une nouvelle classe NomComplet

@Embeddablepublic class NomComplet {

private String nom;private String prenom;public String getNom() {

return nom;}public void setNom(String nom) {

this.nom = nom;}public String getPrenom() {

return prenom;}public void setPrenom(String prenom) {

this.prenom = prenom;}@Overridepublic String toString() {return "NomComplet [nom=" + nom + ", prenom=" + prenom + "]";}

}

H & H: Research and Training 110 / 124

Page 142: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Classes incorporables

HibernateL’entite Personne devient ainsi :

@Entitypublic class Personne {

@Id@GeneratedValue (strategy=GenerationType.IDENTITY)private int num;

private NomComplet nomComplet;

public int getNum() {return num;

}public void setNum(int num) {

this.num = num;}public NomComplet getNomComplet() {

return nomComplet;}public void setNomComplet(NomComplet nomComplet) {

this.nomComplet = nomComplet;}

H & H: Research and Training 111 / 124

Page 143: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Classes incorporables

Hibernate

Les classes incorporables : pas de table correspondante en BD

Personne personne = new Personne();NomComplet nomComplet = new NomComplet();nomComplet.setNom("travolta");nomComplet.setPrenom("john");personne.setNomComplet(nomComplet);Transaction transaction = session.beginTransaction();transaction.begin();session.persist(personne);transaction.commit();

Il n’y aura pas de table NomComplet, les attributs nom et prenom seronttransformes en colonne dans la table Personne

H & H: Research and Training 112 / 124

Page 144: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Classes incorporables

Hibernate

Les classes incorporables : pas de table correspondante en BD

Personne personne = new Personne();NomComplet nomComplet = new NomComplet();nomComplet.setNom("travolta");nomComplet.setPrenom("john");personne.setNomComplet(nomComplet);Transaction transaction = session.beginTransaction();transaction.begin();session.persist(personne);transaction.commit();

Il n’y aura pas de table NomComplet, les attributs nom et prenom seronttransformes en colonne dans la table Personne

H & H: Research and Training 112 / 124

Page 145: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Methodes callback

Hibernate

Cycle de vie d’une entite

Le cycle de vie de chaque objet d’une entite JPA passe par troisevenements principaux

creation (avec persist())

mise a jour (avec flush())

suppression (avec remove())

H & H: Research and Training 113 / 124

Page 146: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Methodes callback

Hibernate

Une methode callback

Une methode callback est une methode qui sera appelee avantou apres un evenement survenu sur une entiteOn utilise les annotations pour specifier quand la methodecallback sera appelee

C’est comme les triggers en SQL

H & H: Research and Training 114 / 124

Page 147: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Methodes callback

Hibernate

Une methode callback

Une methode callback est une methode qui sera appelee avantou apres un evenement survenu sur une entiteOn utilise les annotations pour specifier quand la methodecallback sera appelee

C’est comme les triggers en SQL

H & H: Research and Training 114 / 124

Page 148: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Methodes callback

Hibernate@PrePersist : avant qu’une nouvelle entite soit persistee.

@PostPersist : apres l’enregistrement de l’entite dans la basede donnees.

@PostLoad : apres le chargement d’une entite de la base dedonnees.

@PreUpdate : avant que la modification d’une entite soitenregistree en base de donnees.

@PostUpdate : apres que la modification d’une entite estenregistree en base de donnees.

@PreRemove : avant qu’une entite soit supprimee de la base dedonnee.

@PostRemove : apres qu’une entite est supprimee de la base dedonnee.

H & H: Research and Training 115 / 124

Page 149: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Methodes callback

HibernateExemple : l’entite Personne

public class Personne {@Idprivate int num;private String nom;private String prenom;private int nbrMAJ = 0; // pour calculer le nombre de

modificationpublic int getNbrMAJ() {return nbrMAJ;

}public void setNbrMAJ(int nbrMAJ) {this.nbrMAJ = nbrMAJ;

}@PostUpdatepublic void updateNbrMAJ() {this.nbrMAJ++;

}// les autres getters, setters et constructeur

H & H: Research and Training 116 / 124

Page 150: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Methodes callback

Hibernate

Personne p1 = new Personne();p1.setNom("Wick");p1.setPrenom("John");session.getTransaction().begin();session.persist(p1);session.getTransaction().commit();System.out.println("nbrMAJ = " + p1.getNbrMAJ());// affiche nbrMAJ = 0p1.setNom("Travolta");session.getTransaction().begin();session.flush();session.getTransaction().commit();p1.setNom("Abruzzi");session.getTransaction().begin();session.flush();session.getTransaction().commit();System.out.println("nbrMAJ = " + p1.getNbrMAJ());// affiche nbrMAJ = 2

H & H: Research and Training 117 / 124

Page 151: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Restructuration du code

Hibernate

Organisation du code

Creer une classe HibernateUtil qui se charge de lire le fichierhibernate.cfg.xml et de construire un objet deSessionFactory

Creer une deuxieme classe generique GenericDao qui recuperel’objet de SessionFactory construit par HibernateUtil etl’utilise pour faire le CRUD pour l’entite passe comme parametregenerique

Pour chaque entite, on cree une classe Dao qui etendGenericDao

H & H: Research and Training 118 / 124

Page 152: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Restructuration du code

Hibernate

La classe HibernateUtil

package org.eclipse.config;

import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;

public class HibernateUtil {

private static SessionFactory sessionFactory;

public static SessionFactory getSessionFactory() {

Configuration configuration = new Configuration().configure();

return configuration.buildSessionFactory();

}}

H & H: Research and Training 119 / 124

Page 153: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Restructuration du code

La classe GenericDao

package org.eclipse.dao;

import java.util.List;import org.hibernate.Session;import org.hibernate.Transaction;

public class GenericDao <T,P> {

protected Session session;private Class<T> entity;

public GenericDao(Class<T> entity, Session session) {this.session = session;this.entity = entity;

}public Session getSession() {

return session;}public P save(T obj) throws Exception {

Transaction tx = null;P result;try {

tx = session.beginTransaction();result = (P) session.save(obj);tx.commit();

} catch (Exception e) {if (tx != null)

tx.rollback();throw e;

}return result;

}

H & H: Research and Training 120 / 124

Page 154: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Restructuration du code

La classe GenericDao (suite)

public void update(T obj) throws Exception {Transaction tx = null;try {

tx = session.beginTransaction();session.saveOrUpdate(obj);tx.commit();

} catch (Exception e) {if (tx != null)

tx.rollback();throw e;

}}public void delete(T obj) throws Exception {

Transaction tx = null;try {

tx = session.beginTransaction();session.delete(obj);tx.commit();

} catch (Exception e) {if (tx != null)

tx.rollback();throw e;

}}public T findById(int id) {

return session.get(entity, id);}public List<T> findAll() {

return (List<T>) session.createQuery("from " + entity.getName()).list();}

}

H & H: Research and Training 121 / 124

Page 155: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Restructuration du code

Pour les cles primaires des entites, on utilise que les types objetspublic class Personne {private Integer num;private String nom;private String prenom;

public Integer getNum() {return num;

}public void setNum(Integer num) {

this.num = num;}public String getNom() {

return nom;}public void setNom(String nom) {

this.nom = nom;}public String getPrenom() {

return prenom;}public void setPrenom(String prenom) {

this.prenom = prenom;}

}

H & H: Research and Training 122 / 124

Page 156: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Restructuration du code

Hibernate

La classe PersonneDao

package org.eclipse.dao;

import org.eclipse.model.Personne;import org.hibernate.Session;

public class PersonneDao extends GenericDao<Personne,Integer> {

public PersonneDao(Session session) {super(Personne.class, session);

}}

H & H: Research and Training 123 / 124

Page 157: Persistance de données : JPA avec HibernateIntroduction Hibernate Limites de l’API JDBC Necessit´ e de formuler des requ´ etes SQLˆ Logiques relationnelle et objet dans un meme

Restructuration du code

HibernatePour tester tout ca dans le main de App.java

package org.eclipse;

import org.eclipse.config.HibernateUtil;import org.eclipse.dao.PersonneDao;import org.eclipse.model.Personne;import org.hibernate.Session;

public class App {public static void main(String[] args) throws Exception {

Session session = HibernateUtil.getSessionFactory().openSession();Personne personne = new Personne();personne.setNom("Ferdinand");personne.setPrenom("Rio");PersonneDao personneDao = new PersonneDao(session);int cle = personneDao.save(personne);System.out.println(cle);Personne personne2 = personneDao.findById(3);personne2.setNom("Turing");personneDao.saveOrUpdate(personne2);

}}

H & H: Research and Training 124 / 124