institut supérieur de gestion cours pour 3 ème...

176
Institut Supérieur de Gestion Cours pour 3 ème LFIG Java Enterprise Edition : Les EJBs 3.1 et La persistance JPA2 Bayoudhi Chaouki

Upload: dinhque

Post on 08-Feb-2019

213 views

Category:

Documents


0 download

TRANSCRIPT

Institut Supérieur de Gestion

Cours pour 3ème LFIG

Java Enterprise Edition :Les EJBs 3.1 et La persistance JPA2

Bayoudhi Chaouki

Architectures de composants

� C’est un ensemble de définitions d'interfaces entre le

serveur d'application et les composants

� N'importe quel composant peut tourner ou être � N'importe quel composant peut tourner ou être

recompilé sur n'importe quel serveur

� Un tel standard s'appelle une architecture de

composants

� Exemples : CDs audio, à la télé, au VHS, …

2cours AJEE 2012

Architectures de composants

Serveur d’application

Composants

Interfaces standards

spécifiées par l’architecture de

composants

3cours AJEE 2012

Enterprise JavaBeans (EJB)

� Le standard EJB est une architecture de composants pour des composants serveur écrits en java.

1. Adopté par l'industrie

2. Permet d'implémenter des objets métier d'une2. Permet d'implémenter des objets métier d'unemanière propre et réutilisable

3. Portable facilement

4. Rapid Application Development (RAD)

� EJB signifie deux choses :1. Une spécification

2. Un ensemble d'interfaces

EJB = Composant = Bean

4cours AJEE 2012

EJB pour développer des composants

business

� Les EJBs servent à :

� Implémenter de la logique métier : calcul des taxes sur un

ensemble d'achats, envoyer un mail de confirmation après une

commande,…

� Accéder à un SGBD

� Accéder à un autre système d'information (CICS, COBOL,…)

� Applications web : intégration avec JSF/Servlets

� Web services basés sur XML (SOAP, UDDI,…)5cours AJEE 2012

Entreprise JavaBeans (EJB)… Composants d’un serveur d’application

� Un serveur d'application Java EE

= répond aux spécifications Java EE d’Oracle

� Le serveur d'application va fournir les services systèmes génériques :

� La sécurité

6

� La sécurité

� La reprise sur panne

� Les services transactionnel entre composants

� La gestion des utilisateurs

� L'accès aux sources de données

� etc.

cours AJEE 2012

L’architecture Java EE : rappel�Sorte d'architecture à 3 niveaux

�où la couche présentation est divisée en 2 :

�Le client léger : �un navigateur Web

�Un serveur Web�avec JSF, servlets.

7

�avec JSF, servlets.

Couche de présentationApplication standaloneApplication webApplets

Couche métier ; middleware-> Traitements (par des EJB, ou des JavaBeans)

Couche de donnéesSGBD ; Stocke les données

Source: http://download.oracle.com/javaee/6/tutorial/doc/bnaay.htmlcours AJEE 2012

Architecture Java EE et EJB�Sorte d'architecture à 3 niveaux

�où la couche présentation est divisée en 2 :

�Le client léger : �un navigateur Web

�Un serveur Web�avec JSF, servlets.

8

�avec JSF, servlets.

Source: http://download.oracle.comjavaee/6/tutorial/doc/bnaay.html

Les EJB ne fournissent pas de GUI !GUI = Graphic user interfaceGUI : rôle de la couche de présentation.

cours AJEE 2012

Les conteneurs d’EJB et Web

� Les serveurs d’application contiennent des conteneurs

� Un conteneur est l'environnement d'exécution des composants

� Il gère l'interface entre les composants Java EE et les fonctionnalités bas-niveau� multithreading,

9

� multithreading,

� le cache mémoire,

� la sécurité,

� l'accès aux données

� etc.

Source: http://download.oracle.com/javaee/6/tutorial/doc/bnaay.htmlcours AJEE 2012

Conteneurs d’EJB et Web� Les différents types de conteneurs :

� Conteneur d'application cliente et d'applet :

� la machine virtuelle Java

� Conteneur Web :

� pour l'exécution des servlet, JSF, etc.

� Conteneur d'EJB :

composants métier

10

� composants métier

Source: http://download.oracle.com/javaee/6/tutorial/doc/bnaay.htmlcours AJEE 2012

Conteneurs d’EJB� Les communications de l’extérieur

avec les d'EJBs sont interceptées par le conteneur pour fournir un certain nombre de services :

� cycle de vie du bean

� accès au bean

11

� accès au bean

� sécurité d'accès

� accès concurrents

� Transactions

� Libère le développeur d’une grande charge de travail !

Source: http://download.oracle.com/javaee/6/tutorial/doc/bnaay.htmlcours AJEE 2012

Les conteneurs d’EJB

� Par exemple, pour les transactions, l’appel d’une méthode du bean est intercepté par le conteneur qui� peut démarrer une nouvelle transaction

juste avant de donner la main au code de la méthode

� peut lancer un commit de la transaction

12

� peut lancer un commit de la transaction à la fin de l’exécution de la méthode

Source: http://download.oracle.com/javaee/6/tutorial/doc/bnaay.htmlcours AJEE 2012

Les EJBsLes EJBs

cours AJEE 2012 13

Les EJBs� On trouve trois types d’EJBs :

EJBs session :

� sans etat (@Stateless)

� Avec etat (@Stateful)

� Singleton (@Singleton)

Java EE 6 repose à

tous les niveaux sur de

l’injection de code via

des annotations de � Singleton (@Singleton)

EJBs Entity (@Entity)

EJB Message-Driven

(@MessageDriven) : ne sera pas

abordé au niveau de ce cours

cours AJEE 2012 14

code.

Souvent, on ne fera pas

de « new », les variables

seront créées/initialisées

par injection de code.

Session Bean

� Un Session Bean représente

� une action, un verbe,

� une logique métier, un algorithme,

� Un enchaînement de tâches…

� Exemples

� Saisie d'une commande,

� Compression vidéo,

� Gestion d'un caddy, d'un catalogue de produits,

� Transactions bancaires…

15cours AJEE 2012

� Sans état : traite les tâches qui peuvent être accomplies en un seul appel de méthode ; pas d’état maintenu entre 2 appels de méthode

� Exemple : afficher la liste des comptes bancaires d’un client

Session Bean

d’un client

� Avec état : est associé à un seul client ; maintient un état entre plusieurs appels de méthodes ; pour les tâches accomplies en plusieurs étapes

� Exemple : remplir son caddy avec des articles dont les caractéristiques sont affichées sur des pages différentes

16cours AJEE 2012

Session Bean

� Singleton : quand on veut être assuré qu’il n’y a qu’une seule instance du bean pour tous les utilisateurs de l’application

� Exemple : cache d’une liste de pays (pour améliorer � Exemple : cache d’une liste de pays (pour améliorer les performances)

17cours AJEE 2012

Stateless Session Beans� Le client passe toutes les données nécessaires au

traitement lors de l'appel de méthode

� Le container est responsable de la création et de la destruction du Bean

Il peut le détruire juste après un appel de � Il peut le détruire juste après un appel de méthode, ou le garder en mémoire pendant un certain temps pour réutilisation.

Une instance de Stateless Session Bean n'est pas propre à un client donné, elle peut être partagée entre chaque appel de méthode. Le serveur maintient un pool de beans sans état

18cours AJEE 2012

Exemple de bean sans état

import java.math.BigDecimal;import javax.ejb.*;

@Statelesspublic class ConvertisseurBean {

private BigDecimal tauxEuro = new BigDecimal("0.0093016");new BigDecimal("0.0093016");

public BigDecimal yenVersEuro(BigDecimal yen) {BigDecimal val = yen.multiply(tauxEuro);return val.setScale(2, BigDecimal.ROUND_UP);

}

}

19cours AJEE 2012

Interface locale� Si on ne fournit pas d’interface séparé à ConverterBean,

il aura automatiquement l’interface composée de sa méthode publique et il ne pourra être utilisé que par les composants qui sont dans le même serveur composants qui sont dans le même serveur d’application

� Ce qui correspondra au code du transparent suivant

20cours AJEE 2012

Interface locale et implémentation

� @Localpublic interface Convertisseur {

public BigDecimal yenVersEuro(BigDecimal yen);}

� @Statelesspublic class ConvertisseurBean public class ConvertisseurBean

implements Convertisseur {...}

� Donner une interface locale explicite permet de ne pas exposer aux clients toutes les méthodes publiques du bean

21cours AJEE 2012

Interface distante et implémentation

� Pour que le bean session soit utilisable par un composant situé sur un serveur d’application, il faut lui ajouter une interface distante :

� @Remotepublic interface ConvertisseurDistant {

public BigDecimal yenVersEuro(BigDecimal yen);public BigDecimal yenVersEuro(BigDecimal yen);}

� @Statelesspublic class ConvertisseurBean

implements Convertisseur {...}

22cours AJEE 2012

Stateful Session Beans� Certaines conversations se déroulent sous forment de

requêtes successives.

� Exemple : un client surfe sur un site de e-commerce, sélectionne des produits, remplit son caddy…sélectionne des produits, remplit son caddy…

� D'une requête HTTP à l'autre, il faut un moyen de conserver un état (le caddy par ex.)

23cours AJEE 2012

Stateful Session Beans� Un Stateful Session Bean est utile pour maintenir un

état pendant la durée de vie du client

� au cours d'appels de méthodes successifs.

� Au cours de transactions successives.� Au cours de transactions successives.

� Si un appel de méthode change l'état du Bean, lors d'un autre appel de méthode l'état sera disponible.

une instance de Stateful Session Bean par client.

La fin de l’utilisaton de l’instance est donné par un appel à une méthode annotée @Remove

24cours AJEE 2012

Exemple de bean avec état@Stateful@StatefulTimeout(300000) // 5 minutespublic class CaddyEJB {

private List<Item> caddy =new ArrayList<Item>();

public void addItem (Item item ) {public void addItem (Item item ) {...

}

@Removepublic void checkout() {

caddy.clear();}...

}

Avec Item un java Bean.25cours AJEE 2012

Problème de ressource

� Le client entretient une conversation avec le bean,

dont l'état doit être disponible lorsque ce même

client appelle une autre méthode.

� Problème si trop de clients utilisent ce type de Bean

en même temps.

� Ressources limitées (connexions, mémoire, sockets…)

� Mauvaise scalabilité du système,

� L'état peut occuper pas mal de mémoire…

26cours AJEE 2012

Passivation / Activation

� Passivation : pour économiser la mémoire, le serveur d’application peut retirer temporairement de la mémoire centrale les beans sessions avec état pour les placer sur le disque

� Activation : le bean sera remis en mémoire dès que � Activation : le bean sera remis en mémoire dès que possible quand les clients en auront besoin

� Pendant la passivation il est bon de libérer les ressources utilisées par le bean (connexions avec la BD par exemple)

� Au moment de l’activation, il faut alors récupérer ces ressources

27cours AJEE 2012

Activation/Passivation callbacks� Lorsqu'un bean va être mis en passivation, le container

peut l’avertir (@PrePassivate)

� Il peut libérer des ressources (connexions…)

� Idem lorsque le bean vient d'être activé (@PostActivate)(@PostActivate)

28cours AJEE 2012

EJB EntityEJB Entity

cours AJEE 2012 29

Entity Bean : une introducton� Un Entity Bean représente

� Des objets persistants stockés dans une base de données,

� Des noms, des données

� Gestion via JPA2 + sessions beans� Gestion via JPA2 + sessions beans

� Nous étudierons

� Le concept de persistance,

� Ce qu'est un entity bean, du point de vue du programmeur,

� Les caractéristiques des entity beans,

� Les concepts de programmation des entity beans.

30cours AJEE 2012

La persistance par sérialisation� Sérialisation = sauvegarde de l'état d'un objet sous forme

d'octets.� Rappel : l'état d'un objet peut être quelque chose de très compliqué.

� Etat d'un objet = ses attributs, y compris les atributs hérités.

� Si les attributs sont eux-même des instances d'une classe, il faut � Si les attributs sont eux-même des instances d'une classe, il faut sauvegarder aussi les attributs de ces instances, etc…

� A partir d'un état sérialisé, on peut reconstruire l'objet

� En java, au travers de l'interface java.io.Serializable , des méthodes de java.io.ObjectInputStream et java.io.ObjectOutputStream

31cours AJEE 2012

La persistance par sérialisation� Défauts nombreux…

� Gestion des versions, maintenance…

� Pas de requêtes complexes…

Exemple : on sérialize mille comptes bancaires. � Exemple : on sérialize mille comptes bancaires. Comment retrouver ceux qui ont un solde négatif ?

Solution : stocker les objets dans une base de donnée

32cours AJEE 2012

La persistance par mapping

objet/BD relationelle

� On stocke l'état d'un objet dans une base de donnée.

Exemple : la classe Personne possède deux attributs nom et prenom, on associe cette classe à une table qui possède deux colonnes : et .possède deux colonnes : nom et prenom.

� On décompose chaque objet en une suite de variables dont on stockera la valeur dans une ou plusieurs tables.

� La persistance permet des requêtes complexes.

33cours AJEE 2012

La persistance par mapping

objet/BD relationelle

34

La persistance à l'aide d'une BD

Objet� Les Base de données objet stockent directement des

objets.

� Il n’y a plus de mapping

� Le langage Object Query Language (OQL) similaire à � Le langage Object Query Language (OQL) similaire à SQL mais permet de manipuler les objets…

� Relations entre les objets évidentes (plus de join…)

� Bonnes performances mais mauvaise scalabilité.

35cours AJEE 2012

Modèle de persistance JPA 2 (Java

Persistance API)

� JPA 2 propose un modèle standard de persistance

à l’aide des Entity beans

� Les outils qui assureront la persistance (Toplink, � Les outils qui assureront la persistance (Toplink,

Hibernate, EclipseLink,...) sont intégrés au

serveur d’application et devront être compatibles

avec la norme JPA 2.

36cours AJEE 2012

Qu'est-ce qu'un Entity Bean� Ces sont des objets qui savent se mapper dans une base

de donnée.

� Ils utilisent un mécanisme de persistance (parmi ceux présentés)présentés)

� Ils servent à représenter sous forme d'objets des données situées dans une base de donnée

Remarque : Le plus souvent un objet = une ou plusieurs ligne(s) dans une ou plusieurs table(s)

37cours AJEE 2012

Qu'est-ce qu'un Entity Bean� Exemples

� Compte bancaire (N°, solde),

� Employé, service, entreprises, livre, produit,

� Cours, élève, examen, note,

� Mais au fait, pourquoi nous embêter à passer par � Mais au fait, pourquoi nous embêter à passer par des objets ?� Plus facile à manipuler par programme,

� Vue plus compacte, on regroupe les données dans un objet.

� On peut associer des méthodes simples pour manipuler ces données…

� On va gagner la couche middleware !

38cours AJEE 2012

Exemple avec un compte bancaire

� On lit les informations d'un compte bancaire en

mémoire, dans une instance d'un entity bean,

� On manipule ces données, on les modifie en

changeant les valeurs des attributs d'instance,changeant les valeurs des attributs d'instance,

� Les données seront mises à jour dans la base de

données automatiquement !

� Instance d'un entity bean = une vue en mémoire des

données physiques

39cours AJEE 2012

Fichiers composant un entity bean� Schéma classique :

� La classe du bean se mappe dans une base de données.

� C’est une classe java « normale » avec des attributs, des accesseurs, des modifieurs, etc.

� On utilisera les méta-données (XML) ou « attributs de code » pour indiquer le mapping, la clé primaire,...

� Clé primaire = un objet sérializable, unique pour chaque instance. C'est la clé primaire au sens SQL.

� Note : on peut aussi utiliser un descripteur XML à la place des annotations de code

� On manipulera les données de la BD à l’aide des EntityBeans + un PERSISTENT MANAGER (PM).

� Le PM s’occupera de tous les accès disque, du cache,...

� Lui seul contrôle quand et comment on va accéder à la BD, c’est lui qui génère le SQL,...

40cours AJEE 2012

Exemple d’entity bean : un livre@Entity public class Book {

@Id @GeneratedValue private Long id; @Column(nullable = false) private String title; private String title; private Float price; @Column(length = 2000) private String description; private String isbn; private Integer nbOfPage; private Boolean illustrations;

// Constructors, getters, setters }

41cours AJEE 2012

Exemple d’entity bean : un livre@Entitypublic class Book {

@Id @GeneratedValueprivate Long id; @Column(nullable = false) private String title ; private String title ; private Float price; @Column(length = 2000) private String description; private String isbn; private Integer nbOfPage; private Boolean illustrations

42cours AJEE 2012

Les annotations de code :

Remarques Génerales

� Nombreuses valeurs par défaut, par exemple une classe entité Personne se mappera dans la table PERSONNE par défaut, un attribut « nom » sur la colonne NOM,…

� Il existe de très nombreux attributs pour les annotations, ce cours présente les principauxannotations, ce cours présente les principaux

� Les règles de JDBC s’appliquent pour le mapping des types. (String vers VARCHAR, Long vers BIGINT, Boolean vers SMALLINT,... )

43cours AJEE 2012

� String vers VARCHAR(255) par défaut,

� Les règles peuvent changer d’un SGBD à l’autre, par exemple String est mappé sur VARCHAR avec Derby, mais sur VARCHAR2 avec Oracle.

Les annotations de code :

Remarques Générales

� Un Integer sur un INTEGER avec Derby mais sur un NUMBER avec Oracle,…

� Dans le cas des clés primaires auto-incrémentées, la manière dont elles sont gérées dépend du SGBD et de l’outil de mapping relationnel-objet

� Si on en change -> la structure des tables change !

44cours AJEE 2012

Exemple d’ajout d’un livrepublic class Main {

public static void main(String[] args) {

// On crée une instance de livreBook book = new Book();book.setTitle("The Hitchhiker's Guide to the Galaxy "); book.setPrice(12.5F); book.setDescription("Science fiction comedy book"); … … // On récupère un pointeur sur l’entity manager

// Remarque : dans une appli web, pas besoin de fai re tout cela !EntityManagerFactory emf =

Persistence.createEntityManagerFactory("chapter02PU "); EntityManager em = emf.createEntityManager();

// On rend l’objet « persistant » dans la base (on l’ insère)EntityTransaction tx = em.getTransaction(); tx.begin(); em.persist(book); tx.commit();

em.close(); emf.close();

} 45cours AJEE 2012

Utilisation par un session bean

� Dans le cas où le client est un « session bean »� du code peut être « injecté »,

� Les transactions sont déclenchées par défaut,@stateless

public class UnSessionBean {public class UnSessionBean {

@PersistenceContext(unitName="EmployeeService")EntityManager em;

public Employee createEmployee(int id, String name, long s alary,byte[] pic) {

Employee emp = new Employee(id);emp.setName(name);…em.persist(emp);

return emp;}

46cours AJEE 2012

� Dans le cas où le client est un « session bean »� du code peut être « injecté »,

� Les transactions sont déclenchées par défaut,@stateless

public class UnSessionBean {

Utilisation par un session bean

public class UnSessionBean {

@PersistenceContext(unitName="EmployeeService")EntityManager em;

public Employee createEmployee(int id, String name, long s alary,byte[] pic) {

Employee emp = new Employee(id);emp.setName(name);…em.persist(emp);

return emp;}

47cours AJEE 2012

@Stateless public class BookBean {

@PersistenceContext(unitName = "chapter04PU") private EntityManager em;

public void createBook() { Book book = new Book(); book.setId(1234L);

Utilisation par un session bean

book.setId(1234L); book.setTitle("The Hitchhiker's Guide to the Galaxy "); book.setPrice(12.5F); book.setDescription("Science fiction created by Dou glas Adams."); book.setIsbn("1-84023-742-2"); book.setNbOfPage(354); book.setIllustrations(false);

em.persist(book);

// Récupère le livre dans la BD par sa clé primaire book = em.find(Book.class, 1234L);

System.out.println(book); }

} 48cours AJEE 2012

Autres annotations@Entity public class Book {

@Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(name = "book_title", nullable = false, upda table = false) private String title; private Float price; @Column(length = 2000) @Column(length = 2000) private String description; private String isbn; @Column(name = "nb_of_page", nullable = false) private Integer nbOfPage; private Boolean illustrations;

@Basic(fetch = FetchType.LAZY) @Lob private byte[] audioText;

// Constructors, getters, setters }

49cours AJEE 2012

Autres annotations (suite)� @Column permet d’indiquer des préférences pour les

colonnes� Attributs possibles : name, unique, nullable,

insertable, updatable, table, length, precision, scale…� @GeneratedValue

� Indique la stratégie de génération automatique des clés primaires,primaires,

� La valeur : GenerationType.auto est recommandée,� Va ajouter une table de séquence

� @Lob indique « large object » (pour un BLOB)� Souvent utilisé avec @Basic(fetch = FetchType.LAZY)

pour indiquer qu’on ne chargera l’attribut que lorsqu’on fera un get dessus

50cours AJEE 2012

Autres annotations (suite)

� Il existe de nombreuses autres annotations,

Voir par exemple : JPA Reference Voir par exemple : JPA Reference

http://www.objectdb.com/api/java/jpa

51cours AJEE 2012

� Quel pilote JDBC utiliser ?

� Comment se connecter à la base ?

� Quel est le nom de la base ?

Toutes ces informations sont absentes coté code source.

� Lorsque la classe Main crée une fabrique

Le fichier de configuration

persistence.xml

� Lorsque la classe Main crée une fabrique EntityManagerFactory, elle lui passe le nom d’une unité de persistance en paramètre

� Cette unité de persistance indique au gestionnaire d’entités le type de la base à utiliser et les paramètres de connexion

� Toutes ces informations sont précisées dans le fichier persistence.xml qui doit être déployé avec les classes.

cours AJEE 2012 52

<?xml version="1.@" encoding="UTF-8"?><persistence xmlns="http://java.sun.com/xml/ns/persistence"version="1.@"><persistence-unit name= "ExemplePU"transaction-type="RESOURCE_LOCAL"><provider>org.eclipse.persistence.jpa.PersistencePr ovider</provider><class> coursJEE.ejbentity.Book </class>

Exemple de fichier de configuration

persistence.xml

<class> coursJEE.ejbentity.Book </class><properties><property name="eclipselink.target-database" value= "DERBY"/><property name="eclipselink.jdbc.driver"value= "org.apache.derby.jdbc.ClientDriver"/><property name="eclipselink.jdbc.url"value="jdbc:derby://localhost:1527/ExempleDB"/><property name="eclipselink.jdbc.user" value=“Chaou ki"/><property name="eclipselink.jdbc.password" value=“B ayoudhi"/></properties></persistence-unit></persistence>

cours AJEE 2012 53

� Le fichier précédent permet de configurer la BD « exempleDB » gérée avec le SGBDR Derby.

� L’unité de persistance ExemplePU définit une connexion JDBC pour la base de données Derby nommée ExempleDB. Elle se connecte à cette base sous le compte utilisateur Chaouki avec le mot de passe Bayoudhi.

Exemple de fichier de configuration

persistence.xml

Chaouki avec le mot de passe Bayoudhi.� Le marqueur <class> demande au fournisseur de persistance

de gérer la classe Book.� Pour que ce code fonctionne, le SGBDR Derby doit s’exécuter

sur le port 1527 et les classes Book et Main doivent avoir été compilées et déployées avec ce fichier META-INF/persistence.xml.

� Gràce à l’API d’EntityManager, notre code manipule des objets de façon orientée objet, sans instruction SQL ni appel JDBC.

cours AJEE 2012 54

Un exemple d’entity bean : un

compte bancaire

•La classe = POJO,•La classe = POJO,

•Sérializable,

•Un attribut = la clé primaire

•C’est tout !

55cours AJEE 2012

Client de l’entity bean précédent : un

session bean (servant de façade/DAO)

•Ce session bean est stateless,•Ce session bean est stateless,

•Utilise un EntityManager,

•Sert à envoyer des requêtes JPQL,

•Méthode persist(entity) pour créer une nouvelle entrée (insert)

•Le reste passe par des appels de méthodes classiques de l’entity bean.

56cours AJEE 2012

Autre version : on garde dans le session

bean la « mémoire » de l’entity bean

•Le session bean est stateful,

•Il garde la référence de l’entity bean,

•On a du « étendre » la portée du Persistence Manager

57cours AJEE 2012

Suite de l’exemple

•Dans getBalance() on n’utilise plus de find,

•On utilise les Exceptions

58cours AJEE 2012

Caractéristiques des entity beans

� Survivent aux crashes du serveur, du SGBD

� Ce sont des vues sur des données dans un SGBD

59cours AJEE 2012

Modifier les données sans passer

par le bean

60cours AJEE 2012

Packager et déployer un Entity Bean

� Les EB sont déployés dans des « persistence Units »,� Spécifié dans le fichier « persistence.xml » qui est dans

le jar contenant les EJBs.

� Exemple le plus simple :� Exemple le plus simple :

� Mais on peut ajouter de nombreux paramètres :� <description>, <provider>, <transaction type>, <mapping

file> etc.

61cours AJEE 2012

Que faire avec un entity manager ?

62cours AJEE 2012

Etats d’un Entity Bean

� Un EB peut avoir 4 états1. New: le bean existe en mémoire mais n’est pas encore associé à

une BD, il n’est pas encore associé à un contexte de persistence (via l’entity manager)

2. Managed : après le persist() par exemple. Le bean est associé 2. Managed : après le persist() par exemple. Le bean est associé avec les données dans la BD. Les changements seront répercutés (transaction terminées ou appel a flush())

3. Detached : le bean est n’est plus associé au contexte de persistenced

4. Removed : le bean est associé à la BD, au contexte, et est programmé pour être supprimé (les données seront supprimées aussi).

63cours AJEE 2012

Utilisation du persistent manager

� Remove() pour supprimer des données,

� Set(), Get(), appel de méthodes de l’entity bean pour modifier les données, mais le bean doit être dans un état « managed »,état « managed »,

� Persist() pour créer des données, le bean devient managé,

� Merge pour faire passer un bean « detached » dans l’état « managed ».

64cours AJEE 2012

Exemple de merge() avec le bean

stateless

65cours AJEE 2012

Recherche d'entity beans� Les entity beans correspondant à des lignes dans une

BD, on peut avoir besoin de faire des recherches.

� Similaire à un SELECT

� Plusieurs fonctions sont proposées par l’entity � Plusieurs fonctions sont proposées par l’entity manager

66cours AJEE 2012

Recherche d’entity beans

� Recherche par clé primaire :

Exécution de requêtes JPQL� Exécution de requêtes JPQL

67cours AJEE 2012

Recherche d’entity beans

� Requêtes SQL:

Requêtes nommées:� Requêtes nommées:

68cours AJEE 2012

JPQL : Quelques exemples

� Voir le fichier PDF fourni avec les TPs !

69cours AJEE 2012

JPQL : Quelques exemples (suite)

70cours AJEE 2012

JPQL : Quelques exemples (suite)

71cours AJEE 2012

JPQL : Quelques exemples (suite)

� Liste toutes les commandes qui ne comprennent pas (LEFT) de produit dont le prix est supérieur à une certaine quantité (et celles qui ne comprennent pas de produits)

72cours AJEE 2012

JPQL : Quelques exemples (suite)

� Requêter sur plusieurs attributs renvoie soit un tableau d’Object, soit une collection de tableaux d’Object

texte = "select e.nom, e.salaire " +" from Employe as e";

query = em.createQuery(texte);List<Object []> liste =List<Object []> liste =(List<Object[]>)query.getResultList();

for (Object[] info : liste) {System.out.println( info[0] + "gagne"

+ info[1] );}

73cours AJEE 2012

� Table des compagnies

� Table des employés

74cours AJEE 2012

JPQL : Quelques exemples (suite)

� Cette requête récupère trois compagnies :

� Mais celle-ci uniquement deux :Mais celle-ci uniquement deux :

� Celle-là : les trois (même si join condition absente)

75cours AJEE 2012

JPQL : Quelques exemples (suite)

� Provoque le chargement des entities reliées

� Prend le devant sur @FetchType.LAZYPrend le devant sur @FetchType.LAZY

� Autre exemple :

76cours AJEE 2012

JPQL : Quelques exemples (suite)

� WHERE et requêtes paramétrées

� Autre exemple avec paramètres nommés

77cours AJEE 2012

JPQL : Quelques exemples (suite)

� Expressions

� Le % dans le LIKE = suite de caractères, le _ = un caractère

78cours AJEE 2012

JPQL : Quelques exemples (suite)

� MEMBER OF

Sous-Requêtes� Sous-Requêtes

79cours AJEE 2012

Fonctions sur chaînes, arithmétique

80cours AJEE 2012

Fonctions sur chaînes, arithmétique

(suite)

81cours AJEE 2012

JPQL : Quelques exemples (suite)

82cours AJEE 2012

JPQL : Quelques exemples (suite)

83cours AJEE 2012

Utiliser des colonnes composites

@Embeddablepublic class Address {

protected String street; protected String city; protected String state; @Embedded@EmbeddedZipcode zipcode;

}

@Embeddablepublic class Zipcode {

String zip; protected String plusFour;

}

84cours AJEE 2012

Utiliser une clé primaire composite

� Similaire à l’exemple précédent sauf que au lieu d’utiliser @Embedded / @Embeddable on utilisera @EmbbededId / Embeddable

@Embeddablepublic class CompositeId { public class CompositeId {

String name; String email

}

@Entity public class Dependent {@EmbeddedId // indique que la clé primaire est dans une autre classe

CompositeId id; @ManyToOneEmployee emp;

}

85cours AJEE 2012

On complique un peu l'étude des

entity beans !� Les entity beans représentant des données dans une

BD, il est logique d'avoir envie de s'occuper de gérer des relations

� Exemples� Exemples� Une commande et des lignes de commande

� Une personne et une adresse

� Un cours et les élèves qui suivent ce cours

� Un livre et ses auteurs

� Nous allons voir comment spécifier ces relations dans notre modèle EJB

86cours AJEE 2012

Direction des relations

(directionality)� Unidirectionnelle

� On ne peut aller que du bean A vers le bean B

� Bidirectionnelle

On peut aller du bean A vers le bean B et inversement� On peut aller du bean A vers le bean B et inversement

87cours AJEE 2012

Concepts abordés� Cardinalité (1-1, 1-n, n-n…),

� Direction des relations (bi-directionnelles, uni-directionnelles),

� Agrégation vs composition et destructions en cascade,Agrégation vs composition et destructions en cascade,

� Relations récursives, circulaires, agressive-load, lazy-load,

� Intégrité référentielle,

� Accéder aux relations depuis un code client, via des Collections,

� Comment gérer tout ça !

88cours AJEE 2012

Cardinalité� La cardinalité indique combien d'instances vont

intervenir de chaque côté d'une relation

� One-to-One (1:1)

� Un employé a une adresse…� Un employé a une adresse…

� One-to-Many (1:N)

� Un PDG et ses employés…

� Many-to-Many (M:N)

� Des étudiants suivent des cours…

89cours AJEE 2012

Cardinalité

90cours AJEE 2012

Relations 1:1� Représentée typiquement par une clé étrangère dans

une BD

� Ex : une commande et un colis

91cours AJEE 2012

Relations 1:1, le bean Order

92cours AJEE 2012

Relations 1:1, le bean Order

93cours AJEE 2012

Relations 1:1, le bean Shipment

94cours AJEE 2012

Exemple de code pour insérer une commande

avec une livraison reliée

95cours AJEE 2012

Relations 1:1, exemple de client (ici

un main…)

96cours AJEE 2012

Version bidirectionnelle (on modifie

Shipment)

97cours AJEE 2012

Version bidirectionnelle (suite)

98cours AJEE 2012

Version bi-directionnelle (suite,

code qui fait le persist)� On peut maintenant ajouter au code de tout à l’heure

(celui qui écrit une commande) :

99cours AJEE 2012

Version bi-directionnelle (suite,

code du client)

100cours AJEE 2012

Relations 1:N

� Exemple : une entreprise a plusieurs employés

101cours AJEE 2012

Relations 1:N� Exemple : une entreprise a plusieurs employés

� Solution plus propre (éviter les BLOBs!)

102cours AJEE 2012

Relations 1:N exemple

103cours AJEE 2012

Relations 1:N exemple

104cours AJEE 2012

Exemple de code qui insère des compagnies

105cours AJEE 2012

Exemple de code qui liste des compagnies

106cours AJEE 2012

Exemple de client

107cours AJEE 2012

Version bidirectionnelle

108cours AJEE 2012

Version bidirectionnelle

109cours AJEE 2012

Version bidirectionnelle

110cours AJEE 2012

Relations M:N� Un étudiant suit plusieurs cours, un cours a plusieurs

étudiants inscrits

� Table de jointure nécessaire.

111cours AJEE 2012

Relations M:N, choix de conception� Deux possibilités lorsqu'on modélise cette relation

avec des EJBs

1. Utiliser un troisième EJB pour modéliser la table de jointure. On veut peut-être mémoriser la date où un jointure. On veut peut-être mémoriser la date où un étudiant s'est inscrit, etc… Cet EJB possèdera deux relations 1:N vers le bean Student et le vers le bean Course

2. Si on n’a rien besoin de plus à part la relation, on peut utiliser simplement deux EJB, chacun ayant un attribut correspondant à une Collection de l'autre EJB…

112cours AJEE 2012

Relations M:N, exemple

113cours AJEE 2012

Relations M:N, exemple

114cours AJEE 2012

Relations M:N, exemple

115cours AJEE 2012

Relations M:N, exemple

116cours AJEE 2012

Relations M:N, exemple

117cours AJEE 2012

La directionalité et le modèle de

données dans la DB� Qu’on soit en présence d’un modèle normalisé ou pas,

les outils d’ORM s’adaptent.

Schéma normalisé

Schéma dénormalisé

118cours AJEE 2012

Choisir la directionalité ?� Premier critère : la logique de votre application,

� Second critère : si le schéma relationnel existe, s'adapter au mieux pour éviter de mauvaises performances. performances.

119cours AJEE 2012

Lazy-loading des relations� Agressive-loading

� Lorsqu'on charge un bean, on charge aussi tous les beans avec lesquels il a une relation.

� Cas de la Commande et des Colis plus tôt dans ce chapitre.

� Peut provoquer un énorme processus de chargement si le graphe de relations est grand.

� Lazy-loading� On ne charge les beans en relation que lorsqu'on essaie d'accéder à

l'attribut qui illustre la relation.

� Tant qu'on ne demande pas quels cours il suit, le bean Etudiant n'appelle pas de méthode finder sur le bean Cours.

120cours AJEE 2012

Agrégation vs Composition et

destructions en cascade� Relation par Agrégation

� Le bean utilise un autre bean

� Conséquence : si le bean A utilise le bean B, lorsqu'on détruit A on ne détruit pas B.

� Par exemple, lorsqu'on supprime un étudiant on ne supprime pas � Par exemple, lorsqu'on supprime un étudiant on ne supprime pas les cours qu'il suit. Et vice-versa.

� Relation par Composition� Le bean se compose d'un autre bean.

� Par exemple, une commande se compose de lignes de commande…

� Si on détruit la commande on détruit aussi les lignes correspondantes.

� Ce type de relation implique des destructions en cascade..

121cours AJEE 2012

Relations et JPQL� Lorsqu'on définit une relation en CMP, on peut aussi

indiquer la requête qui permet de remplir le champs associé à la relation.

� On fait ceci à l'aide de JPQL� On fait ceci à l'aide de JPQL

SELECT o.customer

FROM Order o

� Principale différence avec SQL, l'opérateur "."� Pas besoin de connaître le nom des tables, ni le nom des

colonnes…

Renvoie tous les clients qui ont placé une commande

122cours AJEE 2012

Relations et EJB-QL

� On peut aller plus loin…

SELECT o.customer.address.homePhoneNumber

FROM Order oFROM Order o

� On se promène le long des relations…

123cours AJEE 2012

Relations récursives� Relation vers un bean de la même classe

� Exemple : Employé/Manager

� Rien de particulier, ces relations sont implémentées exactement comme les relations non récursives…

124cours AJEE 2012

Relations circulaires� Similaire au relations récursives sauf qu'elles impliquent

plusieurs types de beans� Ex : un employé travaille dans une division, une division possède

plusieurs ordinateurs (workstation), une workstation est allouée à un employé…un employé…

� Ce type de relation, en cas de agressive-loading peut mener à une boucle sans fin…� Même problème avec les destructions en cascade…

125cours AJEE 2012

Relations circulaires� Plusieurs stratégies sont possibles

1. Certains containers proposent d'optimiser le chargement d'un bean en chargeant toutes ses relations en cascade. Attention si relations circulaires !

2. Supprimer une des relations (!!!) si le modèle de conception le 2. Supprimer une des relations (!!!) si le modèle de conception le permet.

3. Supprimer la bidirectionnalité d'une des relations pour briser le cercle, si le modèle de conception le permet.

4. Utiliser le lazy-loading et ne pas faire de destruction en cascade.

5. Les meilleurs moteurs CMP détectent les relations circulaires et vous permettent de traiter le problème avant le runtime.

126cours AJEE 2012

Intégrité référentielle� Un bean Compagnie, Division, etc… a des relations

avec un bean Employé� Si on supprime un employé, il faut vérifier qu'il est bien

supprimé partout où on a une relation avec lui.

� Problème classique dans les SGBDs� Résolus à l'aide de triggers. Ils se déclenchent sitôt

qu'une perte d'intégrité risque d'arriver et effectuent les opérations nécessaires.

� On peut aussi utiliser des procédures stockées via JDBC. Ces procédures effectuent la vérification d'intégrité.

127cours AJEE 2012

Intégrité référentielle� Gérer l'intégrité dans le SGBD est intéressant si la BD

est attaquée par d'autres applications que les EJBs…

� Autre approche : gérer l'intégrité dans les EJBs

� Solution plus propre,� Solution plus propre,

� Le SGBD n'est plus aussi sollicité,

� Avec les EJB: le travail est fait tout seul !

128cours AJEE 2012

Intégrité référentielle� Et dans un contexte distribué ?

� Plusieurs serveurs d'application avec le même composant peuvent accèder à des données sur le même SGBD,SGBD,

� Comment mettre à jour les relations ?

� Problème résolu par les transactions !!!

129cours AJEE 2012

Trier les relations� Lorsqu’on accède aux relations par un getter, on ne

contrôle pas par défaut l’ordre des éléments.

� Plusieurs solutions sont possibles pour récupérer des relations sous forme de collections triéesrelations sous forme de collections triées

� Utiliser l’annotation @OrderBy juste avant la déclaration de la relation ou juste avant le getter

� Utiliser une requête avec un Order By

� Annoter l’attribut correspondant à la colonne qui sera ordonnée, dans l’entity de la relation

130cours AJEE 2012

Trier des relations : annotation

@OrderBy@Entity public class Course { ...

@ManyToMany@OrderBy ("lastname ASC") List<Student> students;

... ... }

� Remarques

� ASC ou DESC pour l’ordre de tri, ASC par défaut,

� lastname est une propriété de l’entité Student.java,

� Si la propriété n’est pas spécifiée -> tri par l’id

131cours AJEE 2012

Trier des relations : annotation

@OrderBy@Entity public class Student { ...

@ManyToMany(mappedBy="students")@OrderBy // tri par clé primaire (défaut)

List<Course> courses;... ...

}

� Remarques

� ASC ou DESC pour l’ordre de tri, ASC par défaut,

� lastname est une propriété de l’entité Student.java,

� Si la propriété n’est pas spécifiée -> tri par l’id

132cours AJEE 2012

Trier des relations : annotation

@OrderBy� On peut utiliser l’opérateur « . » si on trie sur une

colonne qui est définie dans une autre classe par @Embedded

@Entity public class Person { @Entity public class Person { ...

@ElementCollection@OrderBy ("zipcode.zip,

zipcode.plusFour")Set<Address> residences;

... }

133cours AJEE 2012

Trier des relations : annotation

@OrderBy@Embeddablepublic class Address {

protected String street; protected String city; protected String state; @EmbeddedZipcode zipcode;

} }

@Embeddablepublic class Zipcode {

String zip; protected String plusFour;

}

134cours AJEE 2012

Introduction

� Et le polymorphisme ?

� Et l’héritage ?

� Et EJB-QL ?

136cours AJEE 2012

Héritage

� Stratégies de mapping entre classes et tables quand on a de l’héritage ?

� Une table pour toute la hiérarchie de classes ?

� Une table par classe/sous-classe ?� Une table par classe/sous-classe ?

� Autres solutions ?

137cours AJEE 2012

Un exemple !

138cours AJEE 2012

Code de RoadVehicle.java (classe racine)

139cours AJEE 2012

Code de Motorcycle.java

140cours AJEE 2012

Code de Car.java

141cours AJEE 2012

Code de Roadster.java

142cours AJEE 2012

Code de Coupe.java

143cours AJEE 2012

Premier cas : une seule table !

� Une seule table représente toute la hiérarchie.

� Une colonne de « discrimination » est utilisée pour distinguer les sous-classes.

� Cette solution supporte le polymorphisme.� Cette solution supporte le polymorphisme.

� Désavantages :

� Une colonne pour chaque champ de chaque classe,

� Comme une ligne peut être une instance de chaque classe, des champs risquent de ne servir à rien (nullable)

144cours AJEE 2012

Regardons le code avec les annotations !

145cours AJEE 2012

(suite)

146cours AJEE 2012

Motorcycle.java annoté !

147cours AJEE 2012

Car.java annoté

148cours AJEE 2012

Roadster.java annoté

149cours AJEE 2012

Coupe.java annoté

150cours AJEE 2012

Table correspondante

151cours AJEE 2012

Quelques objets persistants !

152cours AJEE 2012

Et les données correspondantes

153cours AJEE 2012

Deuxième stratégie : une table par classe

� Il suffit de modifier quelques annotations !� Dans RoadVehicle.java

� On peut retirer les @Discriminator des sous-classes (on aura des valeurs par défaut)

� Le champ Id de la classe RoadVehicle sera une clé étrangère dans les tables des sous-classes,

� Remarque : on utilise ici @TABLE pour ne pas que la table porte le même nom que dans l’exemple précédent (facultatif)

154cours AJEE 2012

Les tables !

155cours AJEE 2012

Les tables (suite)

156cours AJEE 2012

Requête SQL pour avoir tous les Roadsters

� Il faut faire des joins !

� Plus la hierarchie est profonde, plus il y aura de jointures : problèmes de performance !

157cours AJEE 2012

Conclusion sur cette approche

� Supporte le polymorphisme,

� On alloue juste ce qu’il faut sur disque,

� Excellente approche si on a pas une hiérarchie trop profonde,profonde,

� A éviter sinon…

158cours AJEE 2012

Autres approches

� Des classes qui sont des entity bean peuvent hériter de classes qui n’en sont pas,

� Des classes qui ne sont pas des entity beans peuvent hériter de classes qui en sont,hériter de classes qui en sont,

� Des classes abstraites peuvent être des entity beans,

� (déjà vu : une classe qui est un entity bean hérite d’une autre classe qui est un entity bean)

159cours AJEE 2012

Cas 1 : Entity Bean étends classe java

� On utilise l’attribut @mappedsuperclass dans la classe mère

� Indique qu’aucune table ne lui sera associée

160cours AJEE 2012

Cas 1 (les sous-classes entities)

161cours AJEE 2012

Cas 1 : les tables

162cours AJEE 2012

Remarques sur le cas 1

� RoadVehicle n’aura jamais sa propre table,

� Les sous-classes auront leur propre table, avec comme colonnes les attributs de RoadVehicle en plus des leurs,leurs,

� Si on n’avait pas mis @MappedSuperclass dans RoadVehicle.java, les attributs hérités n’auraient pas été des colonnes dans les tables des sous-classes.

163cours AJEE 2012

Classe abstraite et entity bean

� Une classe abstraite peut être un entity bean (avec @entity)

� Elle ne peut pas être instanciée, ses sous-classes � Elle ne peut pas être instanciée, ses sous-classes concrètes oui,

� Elle aura une table dédiée,

� Elle pourra faire l’objet de requêtes (polymorphisme) : très intéressant !

164cours AJEE 2012

Polymorphisme ! Exemple avec un SessionBean

165cours AJEE 2012

Polymorphisme (suite)

� Des requêtes polymorphes ? Oui c’est possible

166cours AJEE 2012

Polymorphisme : code client

167cours AJEE 2012

Polymorphisme : oui, ça marche !

� C’est bien la méthode toString() de chaque sous-classe qui est appelée !

� La requête à récupéré tous les RoadVehicle (s)

168cours AJEE 2012

JPQL : Quelques exemples

� Voir le fichier PDF fourni avec les TPs !

169cours AJEE 2012

JPQL : Quelques exemples (suite)

170cours AJEE 2012

JPQL : Quelques exemples (suite)

171cours AJEE 2012

JPQL : Quelques exemples (suite)

� Liste toutes les commandes qui ne comprennent pas (LEFT) de produit dont le prix est supérieur à une certaine quantité (et toutes celles qui n’ont pas de produits)produits)

172cours AJEE 2012

� Table des compagnies

� Table des employés

173cours AJEE 2012

JPQL : Quelques exemples (suite)

� Cette requête récupère trois compagnies :

Mais celle-ci uniquement deux :� Mais celle-ci uniquement deux :

� Celle-là en ramène trois aussi (le left matche celles qui n’ont pas de jointure)

174cours AJEE 2012

JPQL : Quelques exemples (suite)

� Provoque le chargement des entities reliées

� Prend le devant sur @FetchType.LAZY

Autre exemple :� Autre exemple :

175cours AJEE 2012

JPQL : Quelques exemples (suite)

� WHERE et requêtes paramétrées

Autre exemple avec paramètres nommés� Autre exemple avec paramètres nommés

176cours AJEE 2012