Entreprise Java Beans

Transcription

Entreprise Java Beans
Java Enterprise Edition
EJB3
Matthieu EXBRAYAT
Master 2 RIA
Université Louis Pasteur
1
Plan
Introduction
Java
EE
Enterprise Java Beans (EJB)
EJB 3.0
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
2
Introduction
Besoin
initial : un environnement
cohérent et global pour le
développement d’applications côté
serveur
J2EE : une solution reposant sur des
composants logiciels
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
3
Problématique
 Une
application serveur (moderne) doit être :
 Évolutive
 Modulaire
(clarification du code et répartition des
compétences)
 Portable (indépendante du matériel et si possible
de l’OS!)
 Robuste (transaction, reprise sur panne)
 Communicante (support de protocoles de
communications)
 Une
solution : le serveur d’application
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
4
Java 2, Enterprise Edition
Spécification
d’une plateforme de
développement (et surtout de
déploiement)
Modèle multi-tiers
Repose sur Java
Mise en œuvre d’EJB, servlets…
Implantation = serveur d’application
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
5
Serveur d’applications

Une infrastructure logicielle qui prend en charge la
« plomberie »



Et qui gère le fonctionnement de composants centrés sur
le métier



Implantation des protocoles de communication, de la gestion de
transaction, du cycle de vie des composants
Il s’agit d’un programme de fond
Le composant va à l’essentiel (métier), sans se soucier de la
plomberie, en respectant une interface standardisée.
Son insertion dans le serveur est décrite par un ensemble de
paramètres (par ex. : descripteur de déploiement)
Définition élastique suivant les générations de serveurs…
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
6
Illustration du concept
Sans serveur d’appli.
Avec serveur d’appli.
Gestion
De la charge ?
----------------------------------------------------------------------------
----------------------------------------------------------------------------
implantation
du protocole de comm.,
de la gestion de transaction…
Prog.
Gestion
Manuelle
des accès
Admin
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Contrôle des accès,
de la charge,
partage de ressources,
gestion des comm…
7
Rôle du Serveur d’Applications
 L’AS
regroupe dans un ensemble cohérent et
standardisé tous les services nécessaires au
déploiement d’un SI professionnel
 Conteneur
d’objets répartis
 Persistance
 Moniteur transactionnel
 Gestionnaire de sécurité
 Service de nommage
 Service Web…
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
8
Plan
Introduction
J2EE
Enterprise
EJB
Java Beans (EJB)
3.0
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
9
L’architecture J2EE (en bref)
Côté client
Côté serveur
Présentation
Client
« léger »
HTML,
SOAP,
…
Servlet
Métier
Backend (stockage)
JDBC,
…
RMI
EJB
EJB
JSP
EJB
RMI
Serveur
distant
(ou client lourd)
JMS
EJB
•Différentes tâches
`Plusieurs
catégories
d’EJB
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP
2007
•Peut être multi sources
•Hors J2EE
•Plateformes peuvent
fournir un SGBD
10
La Couche Client
Clients « légers »
Clients de la couche Web
S’exécutent dans un navigateur
Ne sont pas transactionnels (protocole HTTP)
! Ne pas confondre session et transaction
La sécurité et les transactions sont gérées côté
serveur
Clients « lourds »
Clients de la couche EJB
Interface plus riche (Swing par exemple)
Communique avec le serveur via RMI-IIOP
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
11
La Couche Web
 Une
application Web est un ensemble de
fichiers HTML, de composants Web (JSP,
Servlet) et autres ressources packagés dans
un WAR
 Elle est accessible dans un navigateur mais
s’exécute dans le conteneur Web
 Ce conteneur assure la gestion du cycle de
vie, du contexte de nommage (URL), de la
sécurité et des transactions
 Le conteneur Web peut travailler avec un
serveur EJB
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
12
La Couche EJB
 La
logique métier
 La
logique métier est un ensemble de règles de
gestion propres à un métier donné. Cette logique
est décomposée en éléments implémentés dans
des « objets métier »
 Ces objets ont des caractéristiques (données) et
des comportements (méthodes)
 Ces objets interagissent entre eux, suivant des
règles parfois compliquées mettant en jeu leurs
caractéristiques, leurs comportements, mais aussi
la prise en compte de préconditions et de
postconditions
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
13
Les EJB et les objets métiers
La plateforme J2EE prend en charge l’implémentation
des objets métiers au travers de la norme EJB
 Le conteneur EJB fournit tous les services qui sont en
général, soit le cauchemar des développeurs, soit peu
ou mal traités : gestion des transactions, sécurité,
etc… Le développeur peut donc se concentrer
uniquement sur des problèmes métier.
 Les interfaces ne contiennent donc que du code
d’interfaces: clients plus légers, plus maintenables,
logique métier non dispersée
 Les composants métier sont alors réellement
partageables par plusieurs applications

EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
14
J2EE et Patterns
Architecture
bien structurée mais
complexe
Utilisation rationnelle : mise en oeuvre
de patterns (motifs de conception)
Démarche proposée : se faire la main
concept par concept, prendre
conscience des difficultés, apprécier
l’apport des patterns (nous y reviendrons
donc plus tard).
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
15
Plan
Introduction
J2EE
Enterprise
EJB
Java Beans (EJB)
3.0
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
16
Les Enterprise Java Beans

Un EJB est un composant logiciel qui remplit une
fonction déterminée





Exécution d’une tâche métier (par ex. : planning, catalogue,
facturation…)
Accès à une information persistante (qu’il présente sous la
forme d’un objet…)
Traitement de messages (JMS)
Centralisation des demandes concernant une application
…
Il respecte une forme générale
 Il existe différentes catégories d’EJB, qui doivent
chacune respecter une forme particulière
 Ne pas confondre avec les Java Beans
 De la norme EJB 2.1 à la norme EJB 3.0

EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
17
Les EJB 3.0
 Norme
stabilisée (depuis 2006)
 Remplace
 Pourquoi
peu à peu les normes EJB2.x
commencer par les EJB 3 ?
 Structuration
 Protocole
 Pourquoi
 Une
+ légère, apports de Java 5, donc
+ implicite, manipulation + intuitive
parler ensuite des EJB 2.x ?
norme encore bien implantée
 Une
meilleure compréhension des mécanismes sousjacents (les mains dans le cambouis)
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
18
Une première approche des EJB
Commençons
par comprendre des
manipulations simples, sans accès aux
BDs…
Exemples :
 Un
convertisseur monétaire
 Des services de calculs mathématiques
 Un jeu de devinettes
 Un caddie
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
19
Convertisseur monétaire
 Description
du problème
 Convertisseur
 Peut-on
Franc/Euros et Livres/Euros
tout faire avec un servlet ?
 Techniquement
parlant, oui, mais…
 Approche peu orthodoxe (modèle MVC?)
 Déléguer
métier ?
les calculs à un objet (ou composant)
 Correspond
au modèle MVC
 Un même objet peut fournir les deux méthodes
(cohérence sémantique)
 Java Bean ou Enterprise Java Bean ?
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
20
Objet basique ou EJB ?
Objet
basique : pourquoi pas…
 Simple
à implanter
 Facilement invocable depuis le Servlet
(classe placée dans le WAR)
Mais…
 Que
faire si l’objet se trouve « ailleurs » ?
 Transparence? Réutilisabilité ?
 Cela reste-t-il simple si de multiples objets
sont invoqués ? Plomberie ?
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
21
Solution propre : EJB !
 Du
point de vue de l’EJB
 Le
codage reste simple
 Un
objet légèrement annoté (tags)
 Une
interface : les méthodes exportées
 Une
prise en charge de toute la plomberie, très
intéressante lorsque la complexité augmente
 Du
point de vue du Servlet
 Invoque
 Peut
des méthodes sur un objet
trouver cet objet facilement, « où qu’il soit »
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
22
EJB Session
Le
Session Bean est invoqué par un
client. Il représente un client unique. Il
n’est pas partageable.
Il exécute des tâches pour le compte de
son client, lui masquant la complexité
des traitement.
Il n’est pas persistant, et meurt avec son
client (ou avec l’arrêt du serveur).
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
23
Vue schématique
Client
(Servlet, EJB, ...)
Implantation
(Bean)
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Container
Interface
24
L’interface (locale)
package convejb;
public interface Convertisseur {
public float franc2Euro(float franc);
public float euro2Franc(float euro);
public float pound2Euro(float pound);
public float euro2Pound(float euro);
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
25
L’interface (locale) : Annotation
package convejb;
import javax.ejb.Local;
@Local
public interface Convertisseur {
public float franc2Euro(float franc);
public float euro2Franc(float euro);
public float pound2Euro(float pound);
public float euro2Pound(float euro);
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
26
Le code métier
package convejb;
public class ConvertisseurBean
implements Convertisseur {
public static float E2F=(float)6.55957;
public static float L2E=(float)1.5;
public float euro2Franc(float euro) {
return euro*E2F;
}
public float franc2Euro(float franc) {
return franc/E2F;
}
public float pound2Euro(float pound) {
return pound*L2E;
}
}
public float euro2Pound(float euro) {
return euro/L2E;
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
27
Le code métier : Annotation
package convejb;
import javax.ejb.Stateless;
@Stateless
public class ConvertisseurBean
implements Convertisseur {
public static float E2F=(float)6.55957;
public static float L2E=(float)1.5;
public float franc2Euro(float franc) {
return franc/E2F;
}
public float pound2Euro(float pound) {
return pound*L2E;
}
}
public float euro2Franc(float euro) {
return euro*E2F;
}
public float euro2Pound(float euro) {
return euro/L2E;
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
28
Déploiement de l'EJB
L'EJB
est codé
Reste
à le transférer sur le serveur d'appli
Que
 Un
transfère-t-on ?
fichier .jar contenant :
 Au
moins l'interface et le bean annotés + MANIFEST
 Optionnellement
Comment
 Cela
des infos complémentaires...
?
dépend du serveur d'appli (et de l'IDE)
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
29
Exemple : Jboss et Eclipse
Sous
eclipse: on lance le serveur d'appli
et on demande le déploiement de l'EJB...
Sur
Jboss : le .jar est placé dans le sousrépertoire « server/default/deploy »
Ce
répertoire est scruté périodiquement
 Nouveau
 Fichier
fichier : déploie (du moins essaie)
manquant : retrait du service
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
30
Exemple de .jar
[pcd-exbrayat@univ-orleans]deploy> jar tvf convertisseurEJB3.jar
0 Thu Sep 20 18:06:34 CEST 2007 META-INF/
106 Thu Sep 20 18:06:32 CEST 2007 META-INF/MANIFEST.MF
0 Thu Sep 20 18:04:20 CEST 2007 convejb/
266 Thu Sep 20 17:53:02 CEST 2007 convejb/Convertisseur.class
893 Thu Sep 20 17:53:02 CEST 2007 convejb/ConvertisseurBean.class
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
31
Vue schématique : invocation
Client
(Servlet, EJB, ...)
? (2)
4
1
3
Proxy
Annuaire
Implantation
(Bean)
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Container
Interface
32
Notion de container
 L'EJB
est un objet spécial
 doué
pour le métier
 démuni
 Le
pour les tracas de la vie courante...
container se charge des tracas :-)
 Gère
les accès à l'EJB, et les problèmes qui en
découlent
 Permet
à l'EJB d'accéder à d'autres objets
(recherche dynamique)
 Se
charge de créer les instances de l'EJB... et de
les détruire (cycle de vie)
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
33
Invocation depuis le Servlet
import ...
import convejb.Convertisseur;
public class ConvertisseurServlet extends javax.servlet.http.HttpServlet
implements javax.servlet.Servlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out=response.getWriter();
Context ctx;
Convertisseur conv=null;
try {
ctx = new InitialContext();
conv=(Convertisseur) ctx.lookup("ConvertisseurBean/local");
} catch (NamingException e) {
out.println("erreur : ejb non accessible"); return;
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
34
Invocation depuis le Servlet (Suite)
float valeur=Float.parseFloat(request.getParameter("valeur"));
String monnaieSrc=request.getParameter("src");
String monnaieDest=request.getParameter("dest");
out.print(valeur+" "+monnaieSrc+" = ");
if ((monnaieSrc.equals("franc")) && (monnaieDest.equals("euro"))) {
out.print(conv.franc2Euro(valeur));
} else ...
out.print(monnaieDest);
out.close();
}
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
35
Notion de contexte
Le
contexte donne une fenêtre sur
l'environnement d'exécution.
Permet
notamment l'utilisation du service
de localisation (JNI) : lookup
NamingException
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
36
Déploiement du Servlet
Similairement
 placé
 le
Le
à l'EJB :
dans un .war
.war est déployé sur le serveur d'appli
.war contient :
 La
classe du Servlet
 Le
descripteur de déploiement (cf + tard)
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
37
Exemple de .war
[pcd-exbrayat@univ-orleans]deploy> jar tvf convertisseurWeb.war
0 Thu Sep 20 18:06:46 CEST 2007 META-INF/
106 Thu Sep 20 18:06:44 CEST 2007 META-INF/MANIFEST.MF
0 Thu Sep 20 18:06:44 CEST 2007 WEB-INF/
0 Thu Sep 20 18:06:44 CEST 2007 WEB-INF/classes/
0 Thu Sep 20 18:06:44 CEST 2007 WEB-INF/classes/convweb/
2575 Thu Sep 20 18:03:56 CEST 2007 WEB-INF/classes/convweb/
ConvertisseurServlet.class
1135 Thu Sep 20 17:50:32 CEST 2007 WEB-INF/web.xml
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
38
Interface locale / distante (1)
 Interface
locale
 @Local
 Invocable
dans le même container
 i.e. dans la même machine virtuelle !
 Protocole léger
 Interface
distante
 @Remote
 Invocable
depuis une JVM distante
 Plomberie + lourde (RMI)
 Les méthodes exportées ne sont pas
nécessairement les mêmes
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
39
Interface locale / distante (2)
 Un
EJB Session doit implémenter au moins
une interface métier
 Par défaut elle est locale (@Local optionnel)
 @Remote
obligatoire pour une interface remote
 @Remote et @Local obligatoires si les deux
existent
 Une
idée de structuration (local+remote):
 Une
interface générique
 Deux descendantes de cette interface (avec tags)
 Un
besoin réel d’invocation distante ?
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
40
Exemple
public interface Convertisseur {
public float franc2Euro(float franc);
public float euro2Franc(float euro);
public float pound2Euro(float pound);
public float euro2Pound(float euro);
}
@Local
public interface ConvertisseurLocal extends Convertisseur{}
@Remote
public interface ConvertisseurRemote extends Convertisseur{}
@Stateless
public class ConvertisseurBean
implements ConvertisseurLocal, ConvertisseurRemote {
...
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
41
Calculs mathématiques
Description
 Petite
appli (web) qui propose de fournir des
calculs de factorielles et de suites de
Fibonnacci (original, n’est-ce pas?)
Nouveauté
 Gérer
proprement les valeurs négatives
avec des exceptions
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
42
EJBS et Exceptions
 Exceptions
utilisateur
 Les
exceptions sont sérialisables
 Pas de problèmes pour l’invocation distante
 Exceptions
spécifiques
 EJBException

Se produisent lors de problèmes graves (RunTimeException)
: pas besoin de try/catch
 RemoteException
Liées à l’invocation distante, nécessite try/catch côté client
 Transparentes côté EJB (gérées par le container)

EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
43
Exemple : interface et exception
package fctmathejb;
import javax.ejb.Remote;
@Remote
public interface Fonctions {
public int facto(int f) throws FonctionsException;
public int fibo(int f) throws FonctionsException;
}
package fctmathejb;
public class FonctionsException extends Exception {
public FonctionsException() {
super();
}
public FonctionsException(String message) {
super(message);
}
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
44
Exemple : bean
package fctmathejb;
public class FonctionsBean implements Fonctions {
public int facto(int f) throws FonctionsException {
if (f<0) throw (new FonctionsException ("Valeur Negative!"));
int fact=1;
for (int i=2;i<f;i++) fact*=f;
return fact;
}
public int fibo(int f) throws FonctionsException {
...
}
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
45
Exemple : Servlet (lookup)
Context ctx;
Fonctions f=null;
try {
ctx = new InitialContext();
Object ref= ctx.lookup("FonctionsBean/remote");
f=(Fonctions) PortableRemoteObject.narrow(ref,Fonctions.class)
} catch (NamingException e) {
out.println("erreur : ejb non accessible"); return;
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
46
Bilan : EJB Session sans état
 Les
exemples précédents utilisaient un cas
particulier d’EJB Session : le Session sans
état (Stateless Session Bean)
 @Stateless
 Ne
contient aucun état (aucun attribut lié au client)
 Toutes les instances de ces beans sont donc
équivalentes (sauf pendant l’exécution d’une
méthode), qu’elle que soit leurs clients
 Peut donc être massivement « poolé »
 Exemple : un catalogue, un « mailer »
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
47
Devinettes
 Description
 Un
utilisateur choisit un nombre entre 1 et 10
 Le second utilisateur (sur le même navigateur)
dispose de 3 essais pour trouver ce nombre
 Problèmes
 L’EJB
Session Stateless est sans état, et peut être
partagé entre plusieurs clients
 Où stocker le nombre à deviner ?
 Où stocker le nombre d’essais effectués ?
 Comment s’assurer l’accès exclusif ?
 Solution
: EJB Session avec état
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
48
EJB Session avec état
Stateful
Session Bean
 Contient
un état ayant une influence sur la
façon dont les tâches sont traitées entre
deux appels de son client
 i.e. Il contient des attributs dont la valeur
dépend du client
 De ce fait, le Stateful Session Bean ne peut
être « poolé »
 Il permet d’enchaîner des traitements
corrélés
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
49
Exemple : Devinettes
Interface
bean
invocation
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
50
Exemple : Caddie
interface
bean
invocation
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
51
Injection de valeurs
Un
avantage des EJB : focalisation métier
 Nécessité
: code métier
 Possibilité
de puiser les paramètres au dehors
Injection
de valeurs (d'objet) : @Resource
 Principe
: Un objet (ou une valeur) est défini
« quelque part » à l'extérieur de l'EJB
 Mécanisme
 Le
clair de localisation
container retourne l'objet demandé
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
52
Injection : Syntaxe
Syntaxe
simple
 @Resource
type nom;
 Suppose
égalité des noms
 exemple
: @Ressource float F2E;
Syntaxe
complète
 @Resource
(name= «...» type= «...») type nom;
 exemple
: @Resource (name= «franc2euro»
type= «java.lang.Float») float F2E;
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
53
Injection (2)

Injection au niveau des setters

Invoqué automatiquement avant la première utilisation de
l'attribut

@Resource
public void setF2E(float franc2euro) {
this.F2E=franc2euro;
}

Avantages ?

Le lookup «classique» reste possible

Voire amélioré...

Ctx.lookup(Convertisseur.class.getName());
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
54
Descripteur de déploiement
D'où
viennent les ressources injectées ?
Comment
le container sait-il quelle
ressource correspond à quel EJB ?
Solution
 fichier
: descripteur de déploiement
xml, syntaxe stricte
 présente
 fournit
le bean (et l'interface) au container
une liste de ressources au container
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
55
Exemple
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar id="ejb-jar_ID"
version="3.0"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">
<enterprise-beans>
<session>
<ejb-name>ConvertisseurBean</ejb-name>
<env-entry>
<env-entry-name>franc2euro</env-entry-name>
<env-entry-type>java.lang.Float</env-entry-type>
<env-entry-value>6.55957</env-entry-value>
</env-entry>
</session>
</enterprise-beans>
</ejb-jar>
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
56
Injection et EJB
Les
EJB peuvent s'invoquer entre eux
 Accès
aux données
 Contrôle
 découplage
tâches métier
 ...
Même
principe que l'injection de valeur
 @EJB
classeBean nomBean;
 @EJB
(name=... beanInterface=...) classeBean
nomBean;
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
57
EJB Entities
Exemple
 Les
: Site de petites annonces
annonces doivent être visibles de plusieurs
clients
 EJB
 Elles
Session : pas de partage
doivent être persistantes
 EJB
Session : pas de persistance
Solution
EJB
: des EJB persistants avec état
entity
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
58
EJB Entity 3.0
Dans
la norme EJB 3, les entités sont des
POJO : Plain Old Java Objects
Des
objets classiques, annotés.
Gestion
 Entity
de la persistance externalisée
Manager
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
59
Principe
EJB Session
Select, create, delete
MonObjet(Entity)
Clé
Attribut1
Attribut2
MaTable
...
getClé()
Entity Manager
setClé(...)
getAttribut1()
setAttribut1(...)
Clé
Attribut1
Attribut2
...
...
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
60
Exemple
public class Categorie {
public int getLibelleCat() {
private int numCat;
private String libelleCat;
return libelleCat;
}
public void setlibelleCat(int libelleCat) {
public int getNumCat() {
return numCat;
}
this.libelleCat=libelleCat;
}
}
public void setnumCat(int numCat) {
this.numCat=numCat;
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
61
Exemple Annoté (1)
import javax.persistence.*;
public int getLibelleCat() {
@Entity
return libelleCat;
public class Categorie {
}
private int numCat;
public void setlibelleCat(int libelleCat) {
private String libelleCat;
this.libelleCat=libelleCat;
}
@Id @GeneratedValue
}
public int getNumCat() {
return numCat;
}
public void setnumCat(int numCat) {
this.numCat=numCat;
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
62
Exemple Annoté (2)
import javax.persistence.*;
@Entity
@Column (name=« CAT_TITLE »)
@Table(name=« CAT_TABLE »)
public int getLibelleCat() {
return libelleCat;
public class Categorie {
private int numCat;
}
private String libelleCat;
public void setlibelleCat(int libelleCat) {
this.libelleCat=libelleCat;
@Id @GeneratedValue
}
@Column(name=« CAT_ID »)
}
public int getNumCat() {
return numCat;
}
public void setnumCat(int numCat) {
this.numCat=numCat;
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
63
Entities : Principales Annotations
@Entity
@Id
 @GeneratedValue
@Table
+
[strategy=« … » …]
[name=« … » schema=« … » …]
Attributs pour génération
@Column
 +Attributs
[name=« … » …]
pour génération
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
64
Quelques infos utiles
 Les
Entities EJB3.0 supporte l’héritage, le
polymorphisme, etc.
 Chaque
classe d’entity doit contenir un
constructeur vide (ou pas de constructeur du
tout…)
 Elle
sera sérializable si besoin (c’est-à-dire?)
 Les
variables d’instance ne sont pas publiques
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
65
L’entity Manager
Gère
la persistance des entities, à la
demande de leurs clients (ejb session…)
Un
EM correspond à une source de
données
Repose
sur définition xml
 Source
de données concernée…
Accessible
via Annotation
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
66
Accès à l’EM
 Accès
direct (injection)
 @PersistenceContext(unitname=«
… »)
EntityManager em;
 Accès
par factory (plutôt pour SE)
 @PersistenceUnit(name=«
… »)
EntityManagerFactory emf;
…
EntityManager em=emf.createEntityManager();
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
67
Interface de l’EM
 Persister
 Gestion
 Charger
un entity : em.persist(obj);
de l’objet persisté ?
(depuis des données existantes) par
clé primaire
 em.find(classe,clé)

Exemple : em.find(Categorie.class,110)

Retourne null si valeur non trouvée
 em.getReference(classe,clé)

EntityNotFoundException
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
68
Interface de l’EM (suite)

Charger par requête EJBQL : em.createQuery

Une instance précise



Query q=em.createQuery(« from Categorie c where id=110 »);
Categorie c=(Categorie) q.getSingleResult();
Une collection

Query q=em.createQuery(« from Categorie c»);

List<Categorie> l=q.getResultList();
Synchroniser un entity détaché : merge

Attaché ou détaché ?

Categorie cat=em.merge(detCat);

Instance non existante : copie detCat dans cat (synchronisé)

Instance existante : copie dans l’existant

detCat demeure non géré
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
69
Interface de l’EM (suite et fin)


Suppression : remove

em.remove(cat)

Supprime de la base, détache compte

Que faire pour réinsérer dans la base ?
Synchro depuis base : refresh

em.refresh(cat)

Écrase le contenu de l’entity

Teste de gestion : contains(cat)

Détachement global : clear()

Sauvegarde forcée : flush()

Verrouillage : lock()
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
70
Persistence.xml

Placé dans le META-INF du jar

Notion d’unité de persistence

Exemple simple :

<persistence>
<persistence-unit name=« monUnite »>
<jta-data-source>java:/DefaultDS</jta-data-source>
<properties>
< property name= « hibernate.dialect »
value="org.hibernate.dialect .MySQLDialect " / >
< property name= "hibernate.cache.provider_class«
value= "org.jboss.ejb3.entity.TreeCacheProviderHook"/ >
< property name= "hibernate.treecache.mbean.object_name »
value= "jboss.cache:service= EJB3EntityTreeCache"/>
</properties>
</persistence-unit>
</persistence>
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
71

Documents pareils