20/04/2015© Robert Godin. Tous droits réservés.1 15 Développement d'application de base de données en Java
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.
20/04/2015© Robert Godin. Tous droits réservés Application Java/JDBC client-serveur
20/04/2015© Robert Godin. Tous droits réservés.4 Cas d ’utilisation EnregistrerPrêts
20/04/2015© Robert Godin. Tous droits réservés.5 Cas de test pour scénario normal
20/04/2015© Robert Godin. Tous droits réservés.6 Cas d ’exception : nombre maximal d'emprunts (ici 2) atteint
20/04/2015© Robert Godin. Tous droits réservés.7 Cas d ’exception : exemplaire non disponible
20/04/2015© Robert Godin. Tous droits réservés.8 Cas d'utilisation et classes métiers concernées
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
20/04/2015© Robert Godin. Tous droits réservés.10 Classe Java pour Personne Lecteurs/modifieurs pour attributs (conventions Java Bean)
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
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)
20/04/2015© Robert Godin. Tous droits réservés.13 Classe Java pour Employé
20/04/2015© Robert Godin. Tous droits réservés.14 Classe Java pour Prêt
20/04/2015© Robert Godin. Tous droits réservés.15 Classe Java pour PrêtEnCours
20/04/2015© Robert Godin. Tous droits réservés.16 Classe Java pour Exemplaire
20/04/2015© Robert Godin. Tous droits réservés.17 CourtierBDUtilisateur
20/04/2015© Robert Godin. Tous droits réservés.18 Diagramme de séquence pour CourtierBDUtilisateur
20/04/2015© Robert Godin. Tous droits réservés.19 Classe UsineConnection
20/04/2015© Robert Godin. Tous droits réservés.20 Courtier CourtierBDPrêtEnCours : chercherLesPrêtsEnCours
20/04/2015© Robert Godin. Tous droits réservés.21 Matérialisation d ’un PrêtEnCours : insérerPrêtEnCours
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 ?
20/04/2015© Robert Godin. Tous droits réservés.23 Classe de contrôle ControleEnregistrerPrets
20/04/2015© Robert Godin. Tous droits réservés.24
20/04/2015© Robert Godin. Tous droits réservés Enjeux de conception d'une application Java/JDBC Dépendance au temps de réflexion
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
20/04/2015© Robert Godin. Tous droits réservés.27 Limiter les verrouillages
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
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
20/04/2015© Robert Godin. Tous droits réservés.30 Réduire l'interactivité
20/04/2015© Robert Godin. Tous droits réservés.31 ControleEnregistrerPretsSimple
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)
20/04/2015© Robert Godin. Tous droits réservés 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
20/04/2015© Robert Godin. Tous droits réservés.34 ControleEnrPretsSecuriteParDonnees
20/04/2015© Robert Godin. Tous droits réservés.35 ControleEnrPretsSecuriteParTraitement
20/04/2015© Robert Godin. Tous droits réservés Façade pour les services de la couche application
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
20/04/2015© Robert Godin. Tous droits réservés.38 Patron d'objet de transfert de données (OTD)
20/04/2015© Robert Godin. Tous droits réservés.39 ControleEnregistrerPretsSimpleAvecFacade Connexion libérée entre les appels
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
Java Persistence API (JPA) n Norme de persistance en Java – POJO, POJI – Mappage par annotations – Injection n Incorporée à EJB3 – remplace entités EJB2 – n Compatible JSE/JEE 20/04/2015© Robert Godin. Tous droits réservés.41
Exemple de mappage 20/04/2015© Robert Godin. Tous droits réservés.42
n Entité JPA – Classe capable de persistance 20/04/2015© Robert Godin. Tous droits … public class Editeur implements Serializable … public class Livre implements Serializable {…
n Par défaut attribut traduit par colonne du même nom n Types SQL par défaut pour mappage n Paramétrage – Sur attribut XXX ou méthode setXXX() 20/04/2015© Robert Godin. Tous droits … public class Editeur implements Serializable { = false) private String = false) private String ville;
n Entité doit avoir un identifiant – Correspond à la clé primaire de la table 20/04/2015© Robert Godin. Tous droits … public class Livre implements = false) private String isbn;
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
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 20/04/2015© Robert Godin. Tous droits réservés.47
: clé étrangère 20/04/2015© Robert Godin. Tous droits … public class Livre implements Serializable = "NOMEDITEUR", referencedColumnName = "NOMEDITEUR") private Editeur editeur;
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 … public class Editeur implements Serializable mappedBy ="editeur") private Collection livreCollection;
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
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=" xsi:schemaLocation=" version="1.0" xmlns=" projectexemplejpa.Editeur projectexemplejpa.Livre <property name="toplink.jdbc.url" <property name="toplink.jdbc.password" value="A0D145248EE31051EAA1C822B80C610A"/> Création du EntityManager : EntityManagerFactory unEMF = Persistence.createEntityManagerFactory("ProjectExempleJPA-1"); EntityManager unEM = unEMF.createEntityManager();
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());
Création d’entités (suite) 20/04/2015© Robert Godin. Tous droits réservés.53 Livre unPremierLivre = new Livre(); unPremierLivre.setIsbn(" "); 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(" "); 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();
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)
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());
20/04/2015© Robert Godin. Tous droits = "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()); …
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", " "); Livre l = (Livre)q2.getSingleResult(); l.setAnneeParution(new Long(2003)); uneET.commit();
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
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é
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();
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(); …
@MappedSuperclass 20/04/2015© Robert Godin. Tous droits réservés.62 import javax.persistence.Inheritance; import // Classe non persistante mais qui définit des propriétés persistantes pour les sous-classes public class Personne {…}
20/04/2015© Robert Godin. Tous = "Utilisateur.findAll", query = "select o from Utilisateur o") public class Utilisateur extends Personne implements Serializable Inheritance { InheritanceType strategy() default SINGLE_TABLE; } public enum InheritanceType { SINGLE_TABLE, JOINED, TABLE_PER_CLASS };
@DiscriminatorValue 20/04/2015© Robert Godin. Tous @NamedQuery(name = "Membre.findAll", query = "select o from Membre o") public class Membre extends Utilisateur implements Serializable {
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 !!!
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(); }
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; }
Contrôle de concurrence JPA n JPA 1 – Optimiste sans verrouillage par défaut – Activé par attribut de 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
20/04/2015© Robert Godin. Tous droits réservés Développement d'applications Web par servlet Java
20/04/2015© Robert Godin. Tous droits réservés Principe de base du Web : le protocole HTTP et le langage de présentation HTML
20/04/2015© Robert Godin. Tous droits réservés Développement de servlet Java
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
20/04/2015© Robert Godin. Tous droits réservés.73
20/04/2015© Robert Godin. Tous droits réservés.74
20/04/2015© Robert Godin. Tous droits réservés 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
20/04/2015© Robert Godin. Tous droits réservés Gestion d'une session HTTP dans une servlet La FORM n ’envoie que le idUtilisateur
20/04/2015© Robert Godin. Tous droits réservés.77 FormIdentificationUtilisateurFacade.html
20/04/2015© Robert Godin. Tous droits réservés.78 EnregistrerPrets en deux servlets
20/04/2015© Robert Godin. Tous droits réservés.79
20/04/2015© Robert Godin. Tous droits réservés.80
20/04/2015© Robert Godin. Tous droits réservés 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é
20/04/2015© Robert Godin. Tous droits réservés.82 Ouverture d ’une Connection en passant par DataSource
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)
20/04/2015© Robert Godin. Tous droits réservés.84 Partage d'un pool de connexions
20/04/2015© Robert Godin. Tous droits réservés 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
20/04/2015© Robert Godin. Tous droits réservés Norme EJB de J2EE ( 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
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
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
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
20/04/2015© Robert Godin. Tous droits réservés 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
20/04/2015© Robert Godin. Tous droits réservés.91
20/04/2015© Robert Godin. Tous droits réservés.92 Descripteur de déploiement XML
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
20/04/2015© Robert Godin. Tous droits réservés.94 JDevelopper 10g (déploiement de défaut différent)
20/04/2015© Robert Godin. Tous droits réservés.95 Interposition transparente d ’objets Conteneur de bean
20/04/2015© Robert Godin. Tous droits réservés.96 Dans ServletEnregistrerPretsSimpleFacade remplacer FacadeEnregistrerPretsSimple par une FacadeEJBEnregitrerPretSimple
20/04/2015© Robert Godin. Tous droits réservés Développement d'un EJB session avec état
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()…)
20/04/2015© Robert Godin. Tous droits réservés.99 Classe Bean (suite) : méthode métier identique à FacadeEnregistrerPrets
20/04/2015© Robert Godin. Tous droits réservés.100 Processus de création d ’un EJB avec état
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
20/04/2015© Robert Godin. Tous droits réservés.102 Dans ServletIdentificationUtilisateurFacade et ServletTerminerPretFacade remplacer FacadeEnregistrerPrets par une FacadeEJBEnregistrerPrets
20/04/2015© Robert Godin. Tous droits réservés 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
20/04/2015© Robert Godin. Tous droits réservés Démarcation programmatique de transaction distribuée (bean managed transaction demarcation) Deux connexions indépendantes !
20/04/2015© Robert Godin. Tous droits réservés.105 Classe bean Deux connexions
20/04/2015© Robert Godin. Tous droits réservés.106 Classe bean
20/04/2015© Robert Godin. Tous droits réservés.107 Descripteur de déploiement XML
20/04/2015© Robert Godin. Tous droits réservés Démarcation déclarative de transaction (container managed transaction demarcation)
20/04/2015© Robert Godin. Tous droits réservés.109 Classe bean
20/04/2015© Robert Godin. Tous droits réservés.110 balise n NotSupported n Required n Supports n RequiresNew n Mandatory n Never
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)
EJB session avec EJB3 20/04/2015© Robert Godin. Tous droits public interface EnregistrerPretSimpleJPASessionEJB { Timestamp insererPretEnCours(String idUtilisateur, String idExemplaire); public interface EnregistrerPretSimpleJPASessionEJBLocal { Timestamp insererPretEnCours(String idUtilisateur, String idExemplaire); public class EnregistrerPretSimpleJPASessionEJBBean implements EnregistrerPretSimpleJPASessionEJB, EnregistrerPretSimpleJPASessionEJBLocal private EntityManager em; private Utilisateur unUtilisateur; private Exemplaire unExemplaire; … Injection du EntityManager de type TRANSACTION Démarcation déclarative Défaut : REQUIRED
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; }
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 );