Jpa Spring Hibernate

50
N.Z. Zaher Yamak JPA Java Persistence API

Transcript of Jpa Spring Hibernate

Page 1: Jpa Spring Hibernate

N.Z.

Zaher Yamak

JPA Java Persistence API

Page 2: Jpa Spring Hibernate

N.Z.

Agenda

Zaher Yamak2

Introduction

Les mappings de base

Relations

JPA dans un architecture multi couche

Conclusion

JPA

Page 3: Jpa Spring Hibernate

N.Z.

Definition

La Java Persistence API (abrégée en JPA), est une interface de programmation Java permettant aux développeurs d'organiser des données relationnelles dans des applications utilisant la plateforme Java.

Zaher Yamak3JPA

Page 4: Jpa Spring Hibernate

N.Z.

JPA

Modèle de persistance

POJO basée

Soutien le domaine de modélisation

Langage de requête

élargi

Objet normalisé / cartographie relationnelle

Utilisable dans environnements Java EE et

Java SE

Soutien aux

fournisseurs de

persistance enfichable

Caractéristiques principales

utilisation annotations et/ouXML

4 Zaher YamakJPA

Page 5: Jpa Spring Hibernate

N.Z.Architecture du JPA

Java Application Java Persistence API

Hibernate TopLink Kodo (OpenJPA)

5 Zaher Yamak

•Le plus répandu dans la communauté présentement. •Toutefois, la responsabilité de compatibilité avec différents serveurs d’application revient à la communauté.

Chaque personne peut utiliser sa préférable technologie persistance

JPA

Page 6: Jpa Spring Hibernate

N.Z.

JPA Composants principaux

AnnotationsGestionnaire

d'entités

JPA Composants principaux

6 Zaher YamakJPA

Page 7: Jpa Spring Hibernate

N.Z.

Agenda

Zaher Yamak7

Introduction

Les mappings de base

Relations

JPA dans un architecture multi couche

Conclusion

JPA

Page 8: Jpa Spring Hibernate

N.Z.

Les entités JPA

Cette couche représente le modèle de données objet de l'application.

Les éléments de cette couche sont tous des Value Objects ; c'est-à-dire de simples Beans java (POJO) composés de champs, de getters et de setters.

Ce sont les objets de cette couche qui sont persistés en base de données par un moteur de persistance: Chaque objet (ou presque) est la représentation objet d'un

élément ou d'un ensemble d'éléments relationnels (dans le cas d'un SGBDR).

Dans notre cas, le moteur de persistance est Hibernatemais il est masqué par JPA.

8 Zaher YamakJPA

Page 9: Jpa Spring Hibernate

N.Z.

@Enitity => classe est une entite.

Si nom entite != Nom tableau =>@Table

@Column => Nom de la column dans un tableau(Si != nom de l’attribut)

(par defaut, les deux noms sont similaires.)

@Id => cle primaire.

@Version =>version field in an entity.

JPA utilise la colonne version afin de detecter les modifications .

@GeneratedValue => startegie de donner automatiquement

une valeur unique pour les identites

Les types sont IDENTITY, SEQUENCE, TABLE, and AUTO(Par

defaut est auto)

Les annotations

9 Zaher YamakJPA

Page 10: Jpa Spring Hibernate

N.Z.

Agenda

Zaher Yamak10

Introduction

Les mappings de base

Relations

JPA dans un architecture multi couche

Conclusion

JPA

Page 11: Jpa Spring Hibernate

N.Z.

Les Relations

Zaher Yamak11

•Une companie offre des produits.

•Le Client est libre de faire des ordres des produits en combinison ou un seul

produit.

•Un client peut avoir zéro ou plusieurs ordres, et chaque ordre peut être

associé avec un ou plusieurs produits.

•Pour chaque ordre, une facture est générée.

JPA

Page 12: Jpa Spring Hibernate

N.Z.

Page 12

Relations

4 types de relations à définir entre les entités de la JPA:

Un-à-Un

un-à-plusieurs

plusieurs-à-Un

plusieurs-à-plusieurs

Zaher YamakJPA

Page 13: Jpa Spring Hibernate

N.Z.

Page 13

Relations: Un-à-Un

public class Invoice {

@OneToOne(optional=false)

@JoinColumn(name=“ORDER_ID")

Private Order order;

// getters & setters

}

@Entity(name = "ORDER_INVOICE")

@Id

public class Order {

@Column(name = "ORDER_ID", nullable =

false)

@GeneratedValue(strategy =

GenerationType.AUTO)

private long orderId;

@Column(name = "CUST_ID")

private long custId;

@Column(name = "TOTAL_PRICE", precision =

2)

private double totPrice;

@Column(name = "OREDER_DESC")

private String orderDesc;

@Column(name = "ORDER_DATE")

private Date orderDt;

@OneToOne(optional=false,ca

scade=CascadeType.ALL,

mappedBy="order",targetEnti

ty=Invoice.class)

private Invoice invoice;

@Version

@Column(name = "LAST_UPDATED_TIME")private Date updatedTime;

// getters & setters

}

@Entity ORDERS

@Id

targetEntityspecifie le nom de la

classe

cascade ajouté où on effectue operations:insert, update, deletesur l'entite Order et on veut les propager pour l'objet facture,dans ce cas,on utilise l'option

cascade:PERSIST, REFRESH, REMOVE, ou

MERGE

L'entité Invoicecontient tous les

colonnes du tableau de INVOICE comme

attributs et a un objet Order joigné

avec la cleORDER_ID .

Zaher YamakJPA

Page 14: Jpa Spring Hibernate

N.Z.

Page 14

Relations: un-à-plusieurs

@Entity(name = "CUSTOMER")

public class Customer {

@Id //signifies the primary key

@Column(name = "CUST_ID", nullable = false)

@GeneratedValue(strategy = GenerationType.AUTO)

private long custId

@Column(name = "FIRST_NAME", length = 50)

private String firstName;

@Column(name = "LAST_NAME", nullable= false,length = 50)

private String lastName;

@Column(name = "STREET")

private String street; @OneToMany(mappedBy="customer",targetEntity=Order.class,

fetch=FetchType.EAGER)

private Collection orders;

@OneToMany introduit un nouveau attribut

fetch,LAZY.FetchType est sa valeur par défaut

LAZY est une allusion pour l'exécution JPA,Lazy loading se fait d'une facon complètement transparente; les données sont

chargées dans un objet silencement .

FetchType.EAGER. quand on recupère une entité par un query

ou par EntityManager, on garantie le stockage des données

dans les champs..

Zaher YamakJPA

Page 15: Jpa Spring Hibernate

N.Z.

Page 15

Relations: plusieurs-à-Un

@Entity(name = "ORDERS")

public class Order {

@Id //signifies the primary key

@Column(name = "ORDER_ID", nullable = false)

@GeneratedValue(strategy = GenerationType.AUTO)

private long orderId;

@Column(name = "CUST_ID")

private long custId;

@OneToOne(optional=false,cascade=CascadeType.ALL, mappedBy="order",targetEntity=Invoice.class)

private Invoice invoice

@ManyToOne(optional=false)

@JoinColumn(name="CUST_ID",referencedColumnName="CUST_ID")

private Customer customer;

...............

The other attributes and getters and setters goes here

}

La jointure des deux entités Ordre et Client est faite à

l'aide de la colonne de la clé étrangère CUST_ID, et ici aussi optional=false car

chaque ordre est associé à un seul client.

Alors l'entité Ordre a une relation un-à- un avec la facture et plusieurs-à -un

avec le client.

Zaher YamakJPA

Page 16: Jpa Spring Hibernate

N.Z.

Page 16

Relations: plusieurs-à-plusieurs

@Entity(name = "PRODUCT")

public class Product {

@Id

@Column(name = "PROD_ID", nullable = false)

@GeneratedValue(strategy = GenerationType.AUTO)

private long prodId;

@Column(name = "PROD_NAME", nullable =

false,length = 50)

private String prodName;

@Column(name = "PROD_DESC", length = 200)

private String prodDescription;

@Column(name = "REGULAR_PRICE", precision = 2)

private String price;

@Column(name = "LAST_UPDATED_TIME")

private Date updatedTime;

@ManyToMany(mappedBy="productList",fetch

=FetchType.EAGER)

private List orderList; ...............

The other attributes and getters and setters goes here

}

ORDER_DETAIL tient

l'association entre

tableaux Order et Product.

@JoinTablespecifie le tableau qui

associe order IDs

avec productIDs.

Entity(name = "ORDERS")

public class Order {

@Id

@Column(name = "ORDER_ID", nullable = false)

@GeneratedValue(strategy = GenerationType.AUTO)

private long orderId

@Column(name = "CUST_ID")

private long custId;

@Column(name = "TOTAL_PRICE", precision = 2)

private double totPrice;

@OneToOne(optional=false,cascade=CascadeType.ALL,

mappedBy="order",

targetEntity=Invoice.class)

private Invoice invoice;

@ManyToOne(optional=false)

@JoinColumn(

name="CUST_ID",referencedColumnName="CUST_ID")

private Customer customer;

@ManyToMany(fetch=FetchType.EAGER)

@JoinTable(name="ORDER_DETAIL",

joinColumns=

@JoinColumn(name="ORDER_ID", referencedColumnName="ORDER_ID"),

inverseJoinColumns=

@JoinColumn(name="PROD_ID", r

eferencedColumnName="PROD_ID")

)

private List productList;

...............

} Zaher YamakJPA

Page 17: Jpa Spring Hibernate

N.Z.

Agenda

Zaher Yamak17

Introduction

Les mappings de base

Relations

JPA dans un architecture multi couche

Conclusion

JPA

Page 18: Jpa Spring Hibernate

N.Z.

JPA + Hibernate + Spring

L'utilisation de la couche JPA dans des architectures multi-couches est présentée dansle contextes suivant :

couches [métier] [dao] et [JPA] utilisant les services (injections, transactions) du conteneur léger Spring 3.0

Zaher Yamak18JPA

Page 19: Jpa Spring Hibernate

N.Z.JPA + Hibernate + Spring etape par etape

Zaher Yamak19

Telecharger les librairies Spring

Telecharger les librairies

Hibernate et JDBC

Creer table de base de donnees

Architecture

Spring + JPA + DAO

Implémenter Spring Config

File

Implémenter entité JPA

Implémenter couche DAO

Implémenter couche Service

Implémenter code coté

Client

JPA

Page 20: Jpa Spring Hibernate

N.Z.JPA + Hibernate + Spring etape par etape

Zaher Yamak20

Telecharger les librairies Spring

Telecharger les librairies

Hibernate et JDBC

Creer table de base de donnees

Architecture

Spring + JPA + DAO

Implémenter Spring Config

File

Implémenter entité JPA

Implémenter couche DAO

Implémenter couche Service

Implémenter code coté

Client

JPA

Page 21: Jpa Spring Hibernate

N.Z.JPA + Hibernate + Spring etape par etape

Zaher Yamak21

Telecharger les librairies Spring

Telecharger les librairies

Hibernate et JDBC

Creer table de base de donnees

Architecture

Spring + JPA + DAO

Implémenter Spring Config

File

Implémenter entité JPA

Implémenter couche DAO

Implémenter couche Service

Implémenter code coté

Client

JPA

Page 22: Jpa Spring Hibernate

N.Z.JPA + Hibernate + Spring etape par etape

Zaher Yamak22

Telecharger les librairies Spring

Telecharger les librairies

Hibernate et JDBC

Creer table de base de donnees

Architecture

Spring + JPA + DAO

Implémenter Spring Config

File

Implémenter entité JPA

Implémenter couche DAO

Implémenter couche Service

Implémenter code coté

Client

JPA

Page 23: Jpa Spring Hibernate

N.Z.

La table [personne]

Zaher Yamak23JPA

Page 24: Jpa Spring Hibernate

N.Z.JPA + Hibernate + Spring etape par etape

Zaher Yamak24

Telecharger les librairies Spring

Telecharger les librairies

Hibernate et JDBC

Creer table de base de donnees

Architecture

Spring + JPA + DAO

Implémenter Spring Config

File

Implémenter entité JPA

Implémenter couche DAO

Implémenter couche Service

Implémenter code coté

Client

JPA

Page 25: Jpa Spring Hibernate

N.Z.Le projet Eclipse / Spring / Hibernate

25 Zaher Yamak

en (2) : les codes Java des couches présentés en paquetages :

(entités) : le paquetage des entités JPA

(dao) : la couche d'accès aux données - s'appuie sur la couche JPA

(service) : une couche de services plus que de métier. On y utilisera le service de transactions des conteneurs.

(tests) : regroupe les programmes de tests.

rassemble les fichiers de configuration de Spring pour chacun des SGBD .

les jars nécessaires à Spring.

le projet Eclipse..

JPA

Page 26: Jpa Spring Hibernate

N.Z.JPA + Hibernate + Spring etape par etape

Zaher Yamak26

Telecharger les librairies Spring

Telecharger les librairies

Hibernate et JDBC

Creer table de base de donnees

Architecture

Spring + JPA + DAO

Implémenter Spring Config

File

Implémenter entité JPA

Implémenter couche DAO

Implémenter couche Service

Implémenter code coté

Client

JPA

Page 28: Jpa Spring Hibernate

N.Z.

Persistence.xml

Le fichier déclare une unité de persistance appelée jpa qui utilise des transactions "locales", c.a.d. non fournies par un conteneur EJB3.

Ces transactions sont créées et gérées par Spring et font l'objet de configurations dans le fichier spring-config.xml.

28 Zaher YamakJPA

Page 29: Jpa Spring Hibernate

N.Z.

Spring-config.xml

celle de la base de données cible : lignes 38-41. Nous donnerons un exemple MySql.

29 Zaher Yamak

Il est complexe et bien des choses restent obscures.

Son adaptation à diverses situations se résume souvent à deux modifications :

celle de l'implémentation JPA : lignes 14-32. Peut être change en Toplink.

JPA

Page 30: Jpa Spring Hibernate

N.Z.JPA + Hibernate + Spring etape par etape

Zaher Yamak30

Telecharger les librairies Spring

Telecharger les librairies

Hibernate et JDBC

Creer table de base de donnees

Architecture

Spring + JPA + DAO

Implémenter Spring Config

File

Implémenter entité JPA

Implémenter couche DAO

Implémenter couche Service

Implémenter code coté

Client

JPA

Page 31: Jpa Spring Hibernate

N.Z.

Les entités JPA

Zaher Yamak31JPA

Page 32: Jpa Spring Hibernate

N.Z.JPA + Hibernate + Spring etape par etape

Zaher Yamak32

Telecharger les librairies Spring

Telecharger les librairies

Hibernate et JDBC

Creer table de base de donnees

Architecture

Spring + JPA + DAO

Implémenter Spring Config

File

Implémenter entité JPA

Implémenter couche DAO

Implémenter couche Service

Implémenter code coté

Client

JPA

Page 33: Jpa Spring Hibernate

N.Z.

La couche (dao)

Cette couche est en charge de la gestion des relations avec les sources de données, quelles qu'elles soient.

Elle offre des services d'accès, de recherche, de création, de mise à jour, de suppression de données stockées dans un format quelconque (SGBD, LDAP, XML, etc.).

La couche dao présente l'interface Idao et l’implementation Dao de cette interface.

33 Zaher YamakJPA

Page 34: Jpa Spring Hibernate

N.Z.

Interface-DAO

Zaher Yamak34JPA

Page 35: Jpa Spring Hibernate

N.Z.

DAO-Delete Personne

Zaher Yamak35JPA

Page 36: Jpa Spring Hibernate

N.Z.

DAO-Save,Update,Get Personne

Zaher Yamak36

Save

Update

Get

JPA

Page 37: Jpa Spring Hibernate

N.Z.JPA + Hibernate + Spring etape par etape

Zaher Yamak37

Telecharger les librairies Spring

Telecharger les librairies

Hibernate et JDBC

Creer table de base de donnees

Architecture

Spring + JPA + DAO

Implémenter Spring Config

File

Implémenter entité JPA

Implémenter couche DAO

Implémenter couche Service

Implémenter code coté

Client

JPA

Page 38: Jpa Spring Hibernate

N.Z.JPA + Hibernate + Spring etape par etape

Zaher Yamak38

Telecharger les librairies Spring

Telecharger les librairies

Hibernate et JDBC

Creer table de base de donnees

Architecture

Spring + JPA + DAO

Implémenter Spring Config

File

Implémenter entité JPA

Implémenter couche DAO

Implémenter couche Service

Implémenter code coté

Client

JPA

Page 39: Jpa Spring Hibernate

N.Z.

La couche ( metier / service )

Cette couche implémente l'ensemble de la logique métier de l'application

Elle s'appuie sur les couches DAO et model pour effectuer des opérations CRUD (Create, Research, Update, Delete) sur des objets persistés et leur appliquer ensuite des traitements métier.

Cette couche est responsable des aspects transverses :

– Sécurité

– transactions.

Elle déclare et gère l'ensemble des processus transactionnels vers la couche DAO.

39 Zaher YamakJPA

Page 40: Jpa Spring Hibernate

N.Z.

Interface-Service

Zaher Yamak40JPA

Page 41: Jpa Spring Hibernate

N.Z.

Service – Delete Personnes

Zaher Yamak41JPA

Page 42: Jpa Spring Hibernate

N.Z.Service - Get,Save,Update Personnes

Zaher Yamak42

Get

Save

Update

JPA

Page 43: Jpa Spring Hibernate

N.Z.

Changer de SGBD

L'application cliente 3 ne voit que l'interface JPA 5.

Elle ne voit pas ni l'implémentation réelle de celle-ci, ni le SGBD cible.

On doit changer ces deux éléments de la chaîne sans changements dans le client 3.

43 Zaher YamakJPA

Page 44: Jpa Spring Hibernate

N.Z.

Oracle 10g Express

44 Zaher YamakJPA

Page 45: Jpa Spring Hibernate

N.Z.

PostgreSQL 8.2

45 Zaher YamakJPA

Page 46: Jpa Spring Hibernate

N.Z.

SQL Server Express 2005

46 Zaher YamakJPA

Page 47: Jpa Spring Hibernate

N.Z.

HSQLDB

47 Zaher YamakJPA

Page 48: Jpa Spring Hibernate

N.Z.

Agenda

Zaher Yamak48

Introduction

Les mappings de base

Relations

JPA dans un architecture multi couche

Conclusion

JPA

Page 49: Jpa Spring Hibernate

N.Z.

CONCLUSION

Ce tutoriel a apporté des exemples pour la construction d'architectures multi-couches où:

l'accès aux données est contrôlé par une couche JPA

les couches service et dao s'exécutent ausein d'un conteneur Spring

Des points JPA n'ont pas été abordés :

cache des entités

traduction de la notion objet d'héritage dans un schéma de SGBD.

49 Zaher YamakJPA

Page 50: Jpa Spring Hibernate

N.Z.

Merci