institut supérieur de gestion cours pour 3 ème...
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 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
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 à 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
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
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
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
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
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
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
Relations 1:1� Représentée typiquement par une clé étrangère dans
une BD
� Ex : une commande et un colis
91cours 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
Relations 1:N� Exemple : une entreprise a plusieurs employés
� Solution plus propre (éviter les BLOBs!)
102cours 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
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
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
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
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
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
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 : 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 (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
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