La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

20/04/2015© Robert Godin. Tous droits réservés.1 15 Développement d'application de base de données en Java.

Présentations similaires


Présentation au sujet: "20/04/2015© Robert Godin. Tous droits réservés.1 15 Développement d'application de base de données en Java."— Transcription de la présentation:

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 );


Télécharger ppt "20/04/2015© Robert Godin. Tous droits réservés.1 15 Développement d'application de base de données en Java."

Présentations similaires


Annonces Google