Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parIréné Guillemin Modifié depuis plus de 9 années
1
20/04/2015© Robert Godin. Tous droits réservés.1 15 Développement d'application de base de données en Java
2
20/04/2015© Robert Godin. Tous droits réservés.2 Patron d'architecture en couche (layer) n Couche présentation n Couche contrôle (coordonnateur d'application) n Couche domaine d'application (ou métier) n Couche de services – persistance – transaction – communication – sécurité – etc.
3
20/04/2015© Robert Godin. Tous droits réservés.3 15.1 Application Java/JDBC client-serveur
4
20/04/2015© Robert Godin. Tous droits réservés.4 Cas d ’utilisation EnregistrerPrêts
5
20/04/2015© Robert Godin. Tous droits réservés.5 Cas de test pour scénario normal
6
20/04/2015© Robert Godin. Tous droits réservés.6 Cas d ’exception : nombre maximal d'emprunts (ici 2) atteint
7
20/04/2015© Robert Godin. Tous droits réservés.7 Cas d ’exception : exemplaire non disponible
8
20/04/2015© Robert Godin. Tous droits réservés.8 Cas d'utilisation et classes métiers concernées
9
20/04/2015© Robert Godin. Tous droits réservés.9 Patron courtier BD : classes du programme Java et tables concernées ~ Data Access Object: granularité un courtier par entitéData Access Object
10
20/04/2015© Robert Godin. Tous droits réservés.10 Classe Java pour Personne Lecteurs/modifieurs pour attributs (conventions Java Bean)
11
20/04/2015© Robert Godin. Tous droits réservés.11 Classe Java pour Utilisateur Lecteur pour donnée dérivée Lecteurs/modifieurs pour naviguer les associations
12
20/04/2015© Robert Godin. Tous droits réservés.12 Classe Java pour Membre Attributs et méthodes static pour attributs de classe (ou singleton)
13
20/04/2015© Robert Godin. Tous droits réservés.13 Classe Java pour Employé
14
20/04/2015© Robert Godin. Tous droits réservés.14 Classe Java pour Prêt
15
20/04/2015© Robert Godin. Tous droits réservés.15 Classe Java pour PrêtEnCours
16
20/04/2015© Robert Godin. Tous droits réservés.16 Classe Java pour Exemplaire
17
20/04/2015© Robert Godin. Tous droits réservés.17 CourtierBDUtilisateur
18
20/04/2015© Robert Godin. Tous droits réservés.18 Diagramme de séquence pour CourtierBDUtilisateur
19
20/04/2015© Robert Godin. Tous droits réservés.19 Classe UsineConnection
20
20/04/2015© Robert Godin. Tous droits réservés.20 Courtier CourtierBDPrêtEnCours : chercherLesPrêtsEnCours
21
20/04/2015© Robert Godin. Tous droits réservés.21 Matérialisation d ’un PrêtEnCours : insérerPrêtEnCours
22
20/04/2015© Robert Godin. Tous droits réservés.22 Enjeux de la conception des courtiers n Granularité des courtiers n Granularité de matérialisation/dématérialisation – minimiser les appels au serveur de BD – limiter le volume de données à transférer – dématérialisation paresseuse ou agressive ?
23
20/04/2015© Robert Godin. Tous droits réservés.23 Classe de contrôle ControleEnregistrerPrets
24
20/04/2015© Robert Godin. Tous droits réservés.24
25
20/04/2015© Robert Godin. Tous droits réservés.25 15.1.1 Enjeux de conception d'une application Java/JDBC Dépendance au temps de réflexion
26
Réduire le niveau d’isolation ? n Limiter les verrouillages n Découpage en transactions plus courtes n Considérer l’impact d’un niveau d’isolation plus faible 20/04/2015© Robert Godin. Tous droits réservés.26
27
20/04/2015© Robert Godin. Tous droits réservés.27 Limiter les verrouillages
28
20/04/2015© Robert Godin. Tous droits réservés.28 Vérification des contraintes par le serveur Non sérialisabilité perçue par T2
29
20/04/2015© Robert Godin. Tous droits réservés.29 Contrôle de concurrence optimiste par estampillage explicite n Lecture en une première transaction – Note l’estampille courante (ou numéro de version, …) n Écriture en une deuxième transaction distincte – Vérifie si l’état a changé depuis la lecture n Si non, met à jour les données et l’estampille n Si oui, annulation n Ne bloque pas les objets lus n Populaire dans les applications Web
30
20/04/2015© Robert Godin. Tous droits réservés.30 Réduire l'interactivité
31
20/04/2015© Robert Godin. Tous droits réservés.31 ControleEnregistrerPretsSimple
32
20/04/2015© Robert Godin. Tous droits réservés.32 Libérer la connexion entre les appels n Transaction ne peut chevaucher les appels n Ouverture/fermeture couteuse – Solution : connection pooling (JDBC 2)
33
20/04/2015© Robert Godin. Tous droits réservés.33 15.1.2 Gestion de la sécurité n Qui gère l ’idUtilisateur et le mot de passe ? – par les données : le SGBD – par les traitements : le programme client
34
20/04/2015© Robert Godin. Tous droits réservés.34 ControleEnrPretsSecuriteParDonnees
35
20/04/2015© Robert Godin. Tous droits réservés.35 ControleEnrPretsSecuriteParTraitement
36
20/04/2015© Robert Godin. Tous droits réservés.36 15.1.3 Façade pour les services de la couche application
37
20/04/2015© Robert Godin. Tous droits réservés.37 Diagramme de séquence pour ControleEnregistrerPretAvecFacade Dépendance réduite par rapport à la couche persistence
38
20/04/2015© Robert Godin. Tous droits réservés.38 Patron d'objet de transfert de données (OTD)
39
20/04/2015© Robert Godin. Tous droits réservés.39 ControleEnregistrerPretsSimpleAvecFacade Connexion libérée entre les appels
40
15.2 Persistance transparente avec JPA n Persistance transparente – Doter la classe métier de persistance – Spécification du mappage objet/relationnel – Matérialisation/dématérialisation automatique n Paramétrage – Approche aggressive/paresseuse – Gestion d’anté-mémoire – Comportement transactionnel 20/04/2015© Robert Godin. Tous droits réservés.40
41
Java Persistence API (JPA) n Norme de persistance en Java – POJO, POJI – Mappage par annotations – Injection n Incorporée à EJB3 – remplace entités EJB2 – http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html n Compatible JSE/JEE 20/04/2015© Robert Godin. Tous droits réservés.41
42
Exemple de mappage 20/04/2015© Robert Godin. Tous droits réservés.42
43
Annotation @Entity n Entité JPA – Classe capable de persistance 20/04/2015© Robert Godin. Tous droits réservés.43 @Entity … public class Editeur implements Serializable {… @Entity … public class Livre implements Serializable {…
44
Annotation @Column n Par défaut attribut traduit par colonne du même nom n Types SQL par défaut pour mappage n Paramétrage par @Column – Sur attribut XXX ou méthode setXXX() 20/04/2015© Robert Godin. Tous droits réservés.44 @Entity … public class Editeur implements Serializable { … @Column(nullable = false) private String nomEditeur; @Column(nullable = false) private String ville;
45
Annotation @Id n Entité doit avoir un identifiant – Correspond à la clé primaire de la table 20/04/2015© Robert Godin. Tous droits réservés.45 @Entity … public class Livre implements Serializable { @Id @Column(nullable = false) private String isbn;
46
Annotation @idClass n Pour clé primaire composée n Classe de la clé primaire composée – implémente Serializable – equals() – hashCode() – constructeur vide 20/04/2015© Robert Godin. Tous droits réservés.46
47
Association entre entités n Unidirectionnelle ou bidirectionnelle n Entité propriétaire – Correspond au côté de la clé étrangère n Annotation pour les attributs ou lecteurs n Types permis pour multiplicité * – java.util.Collection, Set, List ou Map n Annotations – @OnoToOne, @OneToMany, @ManyToOne, @ManyToMany 20/04/2015© Robert Godin. Tous droits réservés.47
48
Annotation @ManyToOne n @JoinColumn : clé étrangère 20/04/2015© Robert Godin. Tous droits réservés.48 @Entity … public class Livre implements Serializable { … @ManyToOne @JoinColumn(name = "NOMEDITEUR", referencedColumnName = "NOMEDITEUR") private Editeur editeur;
49
Annotation @OneToMany n public enum CascadeType { ALL, PERSIST, MERGE, REMOVE, REFRESH} – transitivité des opérations – défaut : {} n mappedBy – attribut de l’entité propriétaire de l’association n public enum FetchType { LAZY, EAGER } – défaut : LAZY (dématérialisation paresseuse) 20/04/2015© Robert Godin. Tous droits réservés.49 @Entity … public class Editeur implements Serializable { @OneToMany(cascade=CascadeType.ALL, mappedBy ="editeur") private Collection livreCollection;
50
Manipulation des entités n Gestionnaire d’entité – Instance de EntityManager – Réfère à une unité de persistance n Unité de persistance – Ensemble de classes dotées de persistance – Définie dans le descripteur persistence.xml n Contexte de persistance – Ensemble des entités gérées par le EntityManager 20/04/2015© Robert Godin. Tous droits réservés.50
51
Exemple de création d’un gestionnaire de persistance 20/04/2015© Robert Godin. Tous droits réservés.51 Fichier persistence.xml: <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"> projectexemplejpa.Editeur projectexemplejpa.Livre <property name="toplink.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:xe"/> <property name="toplink.jdbc.password" value="A0D145248EE31051EAA1C822B80C610A"/> Création du EntityManager : EntityManagerFactory unEMF = Persistence.createEntityManagerFactory("ProjectExempleJPA-1"); EntityManager unEM = unEMF.createEntityManager();
52
Création d’entités persistantes 20/04/2015© Robert Godin. Tous droits réservés.52 EntityTransaction uneET = unEM.getTransaction(); System.out.println("Transaction 1: Créer un éditeur avec deux livres associés"); uneET.begin(); Editeur unEditeur = new Editeur(); unEditeur.setNomEditeur("Loze-Dion"); unEditeur.setVille("Longueuil"); unEditeur.setLivreCollection(new ArrayList());
53
Création d’entités (suite) 20/04/2015© Robert Godin. Tous droits réservés.53 Livre unPremierLivre = new Livre(); unPremierLivre.setIsbn("2-921180-89-8"); unPremierLivre.setTitre("Systèmes de gestion de bases de données"); unPremierLivre.setAnneeParution(new Long(2006)); unPremierLivre.setCode("101"); // Il faut maintenir les liens bidirectionnels dans l'application de manière explicite unPremierLivre.setEditeur(unEditeur); unEditeur.getLivreCollection().add(unPremierLivre); Livre unDeuxiemeLivre = new Livre(); unDeuxiemeLivre.setIsbn("2-921180-70-7"); unDeuxiemeLivre.setTitre("Programmation des réseaux sous UNIX"); unDeuxiemeLivre.setAnneeParution(new Long(2000)); unDeuxiemeLivre.setCode("101"); unDeuxiemeLivre.setEditeur(unEditeur); unEditeur.getLivreCollection().add(unDeuxiemeLivre); // Les livres deviennent persistants par référence (cascade = ALL) unEM.persist(unEditeur); uneET.commit();
54
Recherche d’une entité avec find() 20/04/2015© Robert Godin. Tous droits réservés.54 uneET.begin(); Editeur e = unEM.find(Editeur.class,"Loze-Dion"); System.out.println("Nom de l'éditeur:"+e.getNomEditeur()); System.out.println("Ville de l'éditeur:"+e.getVille()); assert (unEditeur == e); Collection lesLivres = e.getLivreCollection(); if (lesLivres == null || lesLivres.size() != 2) { throw new RuntimeException("Nombre de livres non conforme: " + ((lesLivres == null)? "null" : "" + lesLivres.size())); } for (Livre l : lesLivres) { System.out.println(l.getIsbn()); System.out.println(l.getTitre()); } uneET.commit(); Dématérialisation paresseuse (LAZY)
55
Recherche d’une entité avec JPQL et Query 20/04/2015© Robert Godin. Tous droits réservés.55 uneET.begin(); Query q = unEM.createQuery("SELECT e FROM Editeur e WHERE e.nomEditeur = :unNomEditeur"); q.setParameter("unNomEditeur", "Loze-Dion"); e = (Editeur)q.getSingleResult(); System.out.println("Nom de l'éditeur:"+e.getNomEditeur()); System.out.println("Ville de l'éditeur:"+e.getVille());
56
Annotation @NamedQuery 20/04/2015© Robert Godin. Tous droits réservés.56 @NamedQuery(name = "Livre.findAll", query = "select o from Livre o") public class Livre implements Serializable { … List listeDesLivres; listeDesLivres = unEM.createNamedQuery("Livre.findAll").getResultList(); System.out.println("Liste des livres:"); for (Livre l : listeDesLivres) { System.out.println(l.getIsbn()); …
57
Modification d’une entité 20/04/2015© Robert Godin. Tous droits réservés.57 uneET.begin(); Query q2 = unEM.createQuery("SELECT leLivre FROM Livre leLivre WHERE leLivre.isbn = :unIsbn"); q2.setParameter("unIsbn", "2-921180-70-7"); Livre l = (Livre)q2.getSingleResult(); l.setAnneeParution(new Long(2003)); uneET.commit();
58
Suppression d’entité avec remove() 20/04/2015© Robert Godin. Tous droits réservés.58 unEM.remove(e); // Les livres sont supprimés en cascade
59
Entité détachée 20/04/2015© Robert Godin. Tous droits réservés.59 … Editeur e1 = new Editeur(); e1.setNomEditeur("Presses XYZ"); e1.setVille("Une ville"); unEM.persist(e1); // unEditeur devient géré uneET.commit(); unEM.close(); // Contexte de persistance et EntityManager sont supprimés, l'éditeur devient détaché
60
Rattachement avec merge() 20/04/2015© Robert Godin. Tous droits réservés.60 … e1.setVille("Une autre ville"); // Modification sur objet détaché System.out.println("Session 2"); unEM = unEMF.createEntityManager(); uneET = unEM.getTransaction(); Editeur e2 = unEM.merge(e1); // e2 devient géré et intégre les modifs sur e1 uneET.commit();
61
Façade JPA pour EnregistrerPrêt n ControleEnregistrerPretsAvecFacadeJPA – Utilise FacadeEnregistrerPretsJPA n Entités à traiter – Personne, Utilisateur, Employé, Membre, PretEnCours et Exemplaire 20/04/2015© Robert Godin. Tous droits réservés.61 public class FacadeEnregistrerPretsJPA { private EntityManagerFactory emf = Persistence.createEntityManagerFactory("ProjectJPA-1"); private EntityManager em = emf.createEntityManager(); private EntityTransaction et = em.getTransaction(); …
62
@MappedSuperclass 20/04/2015© Robert Godin. Tous droits réservés.62 import javax.persistence.Inheritance; import javax.persistence.MappedSuperclass; @MappedSuperclass // Classe non persistante mais qui définit des propriétés persistantes pour les sous-classes public class Personne {…}
63
@Inheritance @DiscriminatorColumn 20/04/2015© Robert Godin. Tous droits réservés.63 @Entity @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name="categorieutilisateur") @NamedQuery(name = "Utilisateur.findAll", query = "select o from Utilisateur o") public class Utilisateur extends Personne implements Serializable { … @Target({TYPE}) @Retention(RUNTIME) public @interface Inheritance { InheritanceType strategy() default SINGLE_TABLE; } public enum InheritanceType { SINGLE_TABLE, JOINED, TABLE_PER_CLASS };
64
@DiscriminatorValue 20/04/2015© Robert Godin. Tous droits réservés.64 @Entity @DiscriminatorValue("membre") @NamedQuery(name = "Membre.findAll", query = "select o from Membre o") public class Membre extends Utilisateur implements Serializable {
65
OTDUtilisateurPrets() de FacadeEnregistrerPretsJPA 20/04/2015© Robert Godin. Tous droits réservés.65 public OTDUtilisateurPrets chercherOTDUtilisateurPrets(String idUtilisateur)throws Exception { et.begin(); // Début explicite de transaction avec JPA unUtilisateur = em.find(Utilisateur.class, idUtilisateur); // Retourner l'objet de transfert de donnees OTDUtilisateurPrets if (unUtilisateur instanceof Membre){ Membregeneral unMembregeneral; unMembregeneral = em.find(Membregeneral.class,new Long(1)); Membre.setDureeMaxPrets((int)unMembregeneral.getDureemaxprets()); Membre.setNbMaxPrets((int)unMembregeneral.getNbmaxprets()); Membre unMembre = (Membre)unUtilisateur; return new OTDUtilisateurPrets( unMembre.conditionsPretAcceptees(), unMembre.getNbPretsEnCours(), Membre.getNbMaxPrets(), unMembre.getNbRetards()); } else { return new OTDUtilisateurPrets( true,unUtilisateur.getNbPretsEnCours(),0,0); } JPA ne traite pas les static !!!
66
getStatutExemplaire() 20/04/2015© Robert Godin. Tous droits réservés.66 public String getStatutExemplaire(String idExemplaire)throws Exception{ unExemplaire = em.find(Exemplaire.class,idExemplaire); return unExemplaire.getStatut(); }
67
insererPretEnCours() 20/04/2015© Robert Godin. Tous droits réservés.67 public Timestamp insererPretEnCours() throws Exception{ Calendar maintenant = Calendar.getInstance(); // Calendrier avec date actuelle Timestamp dateMaintenant = new Timestamp(maintenant.getTime().getTime()); PretEnCours leNouveauPretEnCours = new PretEnCours(); leNouveauPretEnCours.setUtilisateur(unUtilisateur); leNouveauPretEnCours.setDatepret((Timestamp)dateMaintenant); leNouveauPretEnCours.setExemplaire(unExemplaire); em.persist(leNouveauPretEnCours); return dateMaintenant; }
68
Contrôle de concurrence JPA n JPA 1 – Optimiste sans verrouillage par défaut – Activé par attribut de version annoté @Version – Peut forcer un verrouillage avec lock() de EM n JPA 2 – Introduit le verrouillage pessimiste – Modes PESSIMISTIC_READ et PESSIMISTIC_WRITE 20/04/2015© Robert Godin. Tous droits réservés.68
69
20/04/2015© Robert Godin. Tous droits réservés.69 15.3 Développement d'applications Web par servlet Java
70
20/04/2015© Robert Godin. Tous droits réservés.70 15.3.1 Principe de base du Web : le protocole HTTP et le langage de présentation HTML
71
20/04/2015© Robert Godin. Tous droits réservés.71 15.3.2 Développement de servlet Java
72
20/04/2015© Robert Godin. Tous droits réservés.72 Diagramme de séquence de l'invocation de la servlet ServletEnregistrerPretSimpleFacade Réutilisation des classes du client-serveur
73
20/04/2015© Robert Godin. Tous droits réservés.73
74
20/04/2015© Robert Godin. Tous droits réservés.74
75
20/04/2015© Robert Godin. Tous droits réservés.75 15.3.3 Cycle de vie d'une servlet n Compilation et démarrage à la première invocation (par conteneur) – init() appelé une fois n permet d ’initialiser des ressources (e.g. connexion) – nouveau fil à chaque invocation d ’une méthode de service (doGet, doPost,…) – destroy() à la fin n e.g. fermer connexion
76
20/04/2015© Robert Godin. Tous droits réservés.76 15.3.4 Gestion d'une session HTTP dans une servlet La FORM n ’envoie que le idUtilisateur
77
20/04/2015© Robert Godin. Tous droits réservés.77 FormIdentificationUtilisateurFacade.html
78
20/04/2015© Robert Godin. Tous droits réservés.78 EnregistrerPrets en deux servlets
79
20/04/2015© Robert Godin. Tous droits réservés.79
80
20/04/2015© Robert Godin. Tous droits réservés.80
81
20/04/2015© Robert Godin. Tous droits réservés.81 15.3.5 DataSource, ConnectionPoolDataSource et PooledConnection n Passage par serveur JNDI (Java Naming and Directory Interface) – e.g. service d’annuaire LDAP – repérage de ressources (e.g. serveur BD) – accès sécurisé
82
20/04/2015© Robert Godin. Tous droits réservés.82 Ouverture d ’une Connection en passant par DataSource
83
20/04/2015© Robert Godin. Tous droits réservés.83 Enregistrement du DataSource par descripteur de déploiement XML pour serveur embarqué OC4J de Oracle9i JDevelopper (généré par JDevelopper)
84
20/04/2015© Robert Godin. Tous droits réservés.84 Partage d'un pool de connexions
85
20/04/2015© Robert Godin. Tous droits réservés.85 15.3.6 Mécanismes de sécurité pour l'accès à un servlet n Sécurité programmatique n Sécurité déclarative par le conteneur – rôles/utilisateurs – géré par conteneur
86
20/04/2015© Robert Godin. Tous droits réservés.86 15.4 Norme EJB de J2EE (http://java.sun.com/products/ejb/)http://java.sun.com/products/ejb/ n Transparence « extrême » – persistance – répartition – services n Spécification déclarative de services – comportement transactionnel – sécurité – gestion de ressources (CPU, mémoire, serveurs,...) n e.g. partage transparent d’un bassin d’objets EJB (pooling) entre clients n robustesse, « scalabilité » n Prise en charge des services par le conteneur à EJB
87
20/04/2015© Robert Godin. Tous droits réservés.87 Séparation propre des responsabilités (rôles) n Fournisseur de EJB (EnterpriseBean Provider) – développe les composantes EJB n Assembleur d'application (Application Assembler). – assemble EJB + servlet, JSP, HTML, etc. n Déployeur (Deployer) – déploie les EJB dans leur environnement d'exécution n Fournisseur de serveur EJB (EJB Server Provider). – serveur EJB : services de bas niveau pour le conteneur EJB n Fournisseur de conteneur EJB (EJB Container Provider) – conteneur EJB : environnement de déploiement et d'exécution des EJB n Administrateur de Système (System Administrator) – administre serveur et le conteneur EJB
88
20/04/2015© Robert Godin. Tous droits réservés.88 Catégories de EJB n EJB session (Session Bean) – service d ’objet distant – un seul client à la fois par objet – partage d’un bassin d’objets entre clients – état au besoin entre les appels n stateful/stateless session EJB – non persistent (perdu suite à une panne) n EJB entité (Entity Bean) – services d'objet distant persistant – objet ~ proxy pour une ligne d'une table – un objet EJB entité peut être partagé par plusieurs clients n EJB message (Message Bean) – service de message
89
20/04/2015© Robert Godin. Tous droits réservés.89 Codage d ’un EJB n Interface home – usine à objet EJB n Interface à distance (remote) – accès aux méthodes d'un objet EJB n Classe bean (bean class) – implémente les méthodes de l'objet EJB
90
20/04/2015© Robert Godin. Tous droits réservés.90 15.4.1 Développement d'un EJB session sans état : FacadeEnrPretSimpleSessionEJB n Interface home (usine à EJB) n Interface remote (interface à l’objet EJB) NB Paramètres sérialisables (au sens de Java) passés par valeur
91
20/04/2015© Robert Godin. Tous droits réservés.91
92
20/04/2015© Robert Godin. Tous droits réservés.92 Descripteur de déploiement XML
93
20/04/2015© Robert Godin. Tous droits réservés.93 Client du EJB : façade locale qui délègue à la façade EJB distante (patron Business Delegate)Business Delegate
94
20/04/2015© Robert Godin. Tous droits réservés.94 JDevelopper 10g (déploiement de défaut différent)
95
20/04/2015© Robert Godin. Tous droits réservés.95 Interposition transparente d ’objets Conteneur de bean
96
20/04/2015© Robert Godin. Tous droits réservés.96 Dans ServletEnregistrerPretsSimpleFacade remplacer FacadeEnregistrerPretsSimple par une FacadeEJBEnregitrerPretSimple
97
20/04/2015© Robert Godin. Tous droits réservés.97 15.4.2 Développement d'un EJB session avec état
98
20/04/2015© Robert Godin. Tous droits réservés.98 Classe bean État maintenu entre les appels Méthode du cycle de vie appelée à la création de l’objet avant ejbCreate() NB setSessionContext() permet d’initialiser la connexion au DataSource (interdit dans ejbCreate()…)
99
20/04/2015© Robert Godin. Tous droits réservés.99 Classe Bean (suite) : méthode métier identique à FacadeEnregistrerPrets
100
20/04/2015© Robert Godin. Tous droits réservés.100 Processus de création d ’un EJB avec état
101
20/04/2015© Robert Godin. Tous droits réservés.101 Client du EJB : façade locale qui délègue à la façade EJB distante
102
20/04/2015© Robert Godin. Tous droits réservés.102 Dans ServletIdentificationUtilisateurFacade et ServletTerminerPretFacade remplacer FacadeEnregistrerPrets par une FacadeEJBEnregistrerPrets
103
20/04/2015© Robert Godin. Tous droits réservés.103 15.4.3 Support de transactions distribuées n Plusieurs ressources indépendantes – serveur BD, serveur JMS,... n Protocole transparent de transaction répartie n Démarcation programmatique ou déclarative
104
20/04/2015© Robert Godin. Tous droits réservés.104 15.4.4 Démarcation programmatique de transaction distribuée (bean managed transaction demarcation) Deux connexions indépendantes !
105
20/04/2015© Robert Godin. Tous droits réservés.105 Classe bean Deux connexions
106
20/04/2015© Robert Godin. Tous droits réservés.106 Classe bean
107
20/04/2015© Robert Godin. Tous droits réservés.107 Descripteur de déploiement XML
108
20/04/2015© Robert Godin. Tous droits réservés.108 15.4.5 Démarcation déclarative de transaction (container managed transaction demarcation)
109
20/04/2015© Robert Godin. Tous droits réservés.109 Classe bean
110
20/04/2015© Robert Godin. Tous droits réservés.110 balise n NotSupported n Required n Supports n RequiresNew n Mandatory n Never
111
20/04/2015© Robert Godin. Tous droits réservés.111 EJB 3 n Simplification de l’architecture EJB n Annotation par métadonnées dans le code – Mapping objet-relationnel – Comportement transactionnel n Injection de dépendances pour ressources – DataSource, EntityManager, … n EJB codé comme une classe ordinaire (POJO) n Java Persistence API (JPA) – interface Java indépendante de l’architecture (JSE ou JEE) – test hors conteneur – pas de home (cycle de vie géré par EntityManager)
112
EJB session avec EJB3 20/04/2015© Robert Godin. Tous droits réservés.112 @Remote public interface EnregistrerPretSimpleJPASessionEJB { Timestamp insererPretEnCours(String idUtilisateur, String idExemplaire); } @Local public interface EnregistrerPretSimpleJPASessionEJBLocal { Timestamp insererPretEnCours(String idUtilisateur, String idExemplaire); } @Stateless(name="EnregistrerPretSimpleJPASessionEJB") public class EnregistrerPretSimpleJPASessionEJBBean implements EnregistrerPretSimpleJPASessionEJB, EnregistrerPretSimpleJPASessionEJBLocal { @PersistenceContext(unitName="ProjectJPA-2") private EntityManager em; private Utilisateur unUtilisateur; private Exemplaire unExemplaire; … Injection du EntityManager de type TRANSACTION Démarcation déclarative Défaut : REQUIRED
113
insererPretEnCours() 20/04/2015© Robert Godin. Tous droits réservés.113 public Timestamp insererPretEnCours(String idUtilisateur, String idExemplaire){ unUtilisateur = em.find(Utilisateur.class, idUtilisateur); unExemplaire = em.find(Exemplaire.class,idExemplaire); Calendar maintenant = Calendar.getInstance(); // Calendrier avec date actuelle Timestamp dateMaintenant = new Timestamp(maintenant.getTime().getTime()); PretEnCours leNouveauPretEnCours = new PretEnCours(); leNouveauPretEnCours.setUtilisateur(unUtilisateur); leNouveauPretEnCours.setDatepret((Timestamp)dateMaintenant); leNouveauPretEnCours.setExemplaire(unExemplaire); // Materialiser le PretEnCours dans la BD em.persist(leNouveauPretEnCours); return dateMaintenant; }
114
ServletEnregistrerPretsSimpleFacadeEJB3 n Plus besoin du patron délégué d’affaires 20/04/2015© Robert Godin. Tous droits réservés.114 final Context context = new InitialContext(); EnregistrerPretSimpleJPASessionEJB enregistrerPretSimpleJPASessionEJB = (EnregistrerPretSimpleJPASessionEJB)context.lookup("EnregistrerPretSimpleJPASessionEJB"); // Appel de méthode sur la façade EJB3 java.sql.Timestamp datePret = enregistrerPretSimpleJPASessionEJB.insererPretEnCours( idUtilisateur, idExemplaire );
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.