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