Enregistrer un nouvel évènement

Documents pareils
Etude de cas : PGE JEE V2

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Le stockage local de données en HTML5

Chapitre 10. Les interfaces Comparable et Comparator 1

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Tutoriel d installation de Hibernate avec Eclipse

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Création d une application JEE

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

Programmer en JAVA. par Tama

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Corrigé des exercices sur les références

Introduction à JDBC. Accès aux bases de données en Java

1. Installation d'un serveur d'application JBoss:

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

TD/TP PAC - Programmation n 3

TD/TP PAC - Programmation n 3

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Package Java.util Classe générique

Utilisation d objets : String et ArrayList

Compte Rendu d intégration d application

Généralités sur le Langage Java et éléments syntaxiques.

Threads. Threads. USTL routier 1

Compte-rendu de projet de Système de gestion de base de données

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Application web de gestion de comptes en banques

Serveur d'archivage 2007 Installation et utilisation de la BD exist

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

La base de données XML exist. A. Belaïd

Java Licence professionnelle CISII,

OpenPaaS Le réseau social d'entreprise

Projet de programmation (IK3) : TP n 1 Correction

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

4. Groupement d objets

Un ordonnanceur stupide

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Architecture N-Tier. Ces données peuvent être saisies interactivement via l interface ou lues depuis un disque. Application

as Architecture des Systèmes d Information

Java Licence Professionnelle CISII,

TD3: tableaux avancées, première classe et chaînes

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Java DataBaseConnectivity

Paginer les données côté serveur, mettre en cache côté client

IFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse

Tp 1 correction. Structures de données (IF2)

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

TD2 Programmation concurrentielle

Programme Compte bancaire (code)

RMI le langage Java XII-1 JMF

Programmation par composants (1/3) Programmation par composants (2/3)

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Java 7 Les fondamentaux du langage Java

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Par Laurent DESECHALLIERS. Mastère Spécialisé en Management de Projets en Milieu Industriel. CESI de Rouen Promotion 2002/2003.

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

ACTIVITÉ DE PROGRAMMATION

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

TP1 : Initiation à Java et Eclipse

Rafraichissement conditionné d'une page en.net

PROJET : ETNIC ESB JANUS. Guide technique : WS-Notification - Clustering. BULL Services et Solutions

Urbanisation des SI Conduite du changement IT 20/03/09. Patrick CHAMBET

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Génie Logiciel avec Ada. 4 février 2013

Développement Logiciel

PHP 4 PARTIE : BASE DE DONNEES

Projet Viticulture - TP 3 : bases de données distantes BTS Services informatiques aux organisations

Stockage du fichier dans une table mysql:

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Flux de données Lecture/Ecriture Fichiers

Comment installer Viber et WhatsApp sur son ordinateur!

.NET - Classe de Log

Premiers Pas en Programmation Objet : les Classes et les Objets

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Auto-évaluation Programmation en Java

Objets et Programmation. origine des langages orientés-objet

Langage Java. Classe de première SI

Cours de Génie Logiciel

TP Programmation Java / JDBC / Oracle

Programmation par les Objets en Java

INITIATION AU LANGAGE JAVA

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Composants Logiciels. Le modèle de composant de CORBA. Plan

La gestion de la persistance avec Hibernate. Hibernate et la gestion de persistance. La gestion de la persistance (1/2) Introduction

Remote Method Invocation Les classes implémentant Serializable

Alfstore workflow framework Spécification technique

Exercices sur les interfaces

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Cours 1: Java et les objets

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

PHP 5. La base de données MySql. A. Belaïd 1

Cours Programmation Système

Transcription:

Maintenant que nous avons géré les utilisateurs, voyons l'enregistrement d'un nouvel évènement créé par l'utilisateur qui sera connecté au client. Là encore, nous utiliserons une couche DAO formée d'une interface, nommée EventDAO, et de son implémentation Hibernate, nommée EventDAOHibernate, ainsi qu'une couche de services constituée d'une classe EventServices. Arborescence du projet La nouvelle arborescence du projet est donc la suivante :

Implémentation de la couche DAO L'interface EventDAO est composée uniquement d'une méthode makepersistant() qui renvoie l'entité rendue persistante ou null si la sauvegarde a rencontré un quelconque problème :?package fr.mistra.pgejee.dao; import fr.mistra.pgejpa.model.event;

public interface EventDAO { // Enregistre dans la base de données l'entité passée en paramètre public abstract User makepersistent(event entity); Nous y ajouterons des méthodes supplémentaires par la suite, notamment lorsque nous voudrons récupérer des évènements pour les afficher. Voyons maintenant l'implémentation Hibernate de cette interface : package fr.mistra.pgejee.dao; import org.hibernate.query; import org.hibernate.session; import org.hibernate.transaction; import fr.mistra.pgejpa.model.event; import fr.mistra.pgejpa.utils.hibernateutils; public class EventDAOHibernate implements EventDAO { private Session s = null;

// Enregistre dans la base de données l'entité passée en paramètre public User makepersistent(event entity) { // Récupération d'une session Hibernate if(s == null) s = HibernateUtils.getSession(); // Début de la transaction Hibernate Transaction tx = s.begintransaction(); Event e = null; // Si l'entité possède un identifiant, on teste si elle est persistante if (entity.getid()!= null && entity.getid()!= 0) { // On cherche en base de données s'il existe déjà un event avec le même id Query q = s.createquery("from Event e where e.id=:id").setinteger("id", entity.getid()); e = (Event) q.uniqueresult(); // Sauvegarde d'une entité non persistante if (e == null)

s.save(entity); // Merge d'une entité déjà persistante else entity = s.merge(entity); // Fin de la transaction tx.commit(); // Retourne l'identifiant de l'entité sauvegardée return entity; Dans la liste les fonctionnalités à implémenter, nous avons inclus la modification d'un évènement. Mais pour modifier un évènement, encore faut-il l'avoir au préalable récupéré depuis la base de données pour ensuite effectuer les modifications et les enregistrer. Nous pourrons ainsi avoir à rendre persistant un évènement récupéré depuis la base de données et par conséquent possédant déjà un identifiant : dans ce cas, la méthode Hibernate à utiliser ne sera plus save() mais merge(). Il nous faut donc distinguer ce cas de modification de celui de la première sauvegarde d'un évènement venant tout juste d'être créé. Pour rendre persistant un évènement, nous suivons donc les étapes suivantes :

ouverture d'une session et création d'une transaction Hibernate (lignes 17 à 21), récupération, depuis la base de données, de l'évènement possédant le même identifiant que l'entité à sauvegarder (lignes 23 à 31), si l'entité à sauvegarder est transiente (première sauvegarde), nous utilisons la méthode save (lignes 34-35), sinon, il faut appeler la méthode merge (lignes 37-38 ), dans tous les cas, la transaction est ensuite fermée pour synchroniser le contexte de persistance avec la base de données (ligne 41) et l'entité désormais persistante est renvoyée (ligne 43) Implémentation de la couche de services Voyons maintenant la classe EventService. Elle contiendra, pour l'instant tout du moins, une unique méthode saveevent() correspondant au code ci-dessous : package fr.mistra.pgejee.services; import fr.mistra.pgejee.dao.eventdao; import fr.mistra.pgejee.utils.factory; import fr.mistra.pgejpa.model.event; public class EventServices { private EventDAO edao = Factory.getEventDAO(); // Sauvegarde l'évènement passé en paramètre

public Event saveevent(event entity) { return edao.makepersistent(entity); La méthode saveevent() nécessite un attribut EventDAO (ligne 12). Nous utilisons donc la Factory et sa méthode geteventdao() (ligne 8) pour assurer l'indépendance entre EventServices et l'implémentation Hibernate de EventDAO : // Fournit une implémentation de l'interface EventDAO public static EventDAO geteventdao() { return new EventDAOHibernate(); Test de l'implémentation L'enregistrement d'un nouvel évènement est désormais fonctionnel : pour le vérifier, complétons la classe Main en y ajoutant une méthode de test : package fr.mistra.pgejee.tests; import java.util.arraylist; import java.util.list; import fr.mistra.pgejee.services.eventservices;

import fr.mistra.pgejee.services.userservices; import fr.mistra.pgejpa.model.address; import fr.mistra.pgejpa.model.event; import fr.mistra.pgejpa.model.user; public class Main { private static UserServices uservices = new UserServices(); private static EventServices eservices = new EventServices(); public static void main(string[] args) { testsaveuser(); testgetuserbylogin(); testconnectuser(); testsaveevent(); public static void testsaveevent() { System.out.println("---------- testsaveevent() ----------"); // Création de l'évènement

User owner = uservices.getuserbylogin("mistra"); Event e = new Event("Titre", "description", false); e.setuser(owner); // Enregistrement de évènement e = eservices.saveevent(e); System.out.println("Evènement sauvé : " + e.gettitle()); // Modification de l'évènement e.settitle("titre modifié"); e = eservices.saveevent(e); System.out.println("Evènement modifié : " + e.gettitle()); public static void testconnectuser() { // Voir implementation au chapitre précédent public static void testgetuserbylogin() { // Voir implementation au chapitre précédent

public static void testsaveuser() { // Voir implementation au chapitre précédent Notez que l'utilisation judicieuse des Cascade lors de la réalisation de la couche de persistance (voir chapitres Relation one-to-one et Relation many-to-one du tutoriel Hibernate) nous affranchit de toute gestion particulière de l'attribut User lors de l'enregistrement d'un objet Event : la cascade fait en sorte que la sauvegarde d'un Event entraine la sauvegarde ou la mise à jour de l'user associé. Il en va de même pour Address : en effet, dans ces deux cas, c'est la classe Event qui est maitresse de l'association. Par contre, dans les associations entre Event et Item et entre Event et Guest, Event n'est pas le côté maitre de l'association. Pour pouvoir rendre persistant une entité Event et cascader la persistance sur ses listes d'items et de Guests, il nous faut : rendre persistante l'entité Event, y associer les listes d'items et de Guests, rendre persistante à nouveau l'entité Event. Les entités Items et Guests seront rendues persistantes et les associations seront mises à jour lors du deuxième appel à makepersistant() comme illustré dans le test ci-dessous : package fr.mistra.pgejee.tests;

import java.util.arraylist; import java.util.list; import fr.mistra.pgejee.services.eventservices; import fr.mistra.pgejee.services.userservices; import fr.mistra.pgejpa.model.address; import fr.mistra.pgejpa.model.event; import fr.mistra.pgejpa.model.guest; import fr.mistra.pgejpa.model.item; import fr.mistra.pgejpa.model.user; public class Main { private static UserServices uservices = new UserServices(); private static EventServices eservices = new EventServices(); public static void main(string[] args) { testsaveuser(); testgetuserbylogin(); testconnectuser(); testsaveevent();

testsaveeventwithassociations(); public static void testsaveeventwithassociations() { System.out.println("---------- testsaveeventwithassociations() ----------"); // Création de l'évènement User u = uservices.getuserbylogin("tutoriel"); Address a = new Address("Domicile", "rue des cerisiers", "75001", "Paris"); Event e = new Event("Evènement", "Description de l'évènement", false); e.setuser(u); e.setaddress(a); // Enregistrement de l'évènement e = eservices.saveevent(e); System.out.println("Evènement sauvé : " + e.gettitle()); // Création des listes de courses et d'invités Item i = new Item("jus d'orange", 3, 0); Item i2 = new Item("pistaches", 2, 1);

Guest g = new Guest("invité", "invité(a)mistra.fr"); Guest g2= new Guest("guest", "email(a)mistra.fr"); // Gestion des associations i.setevent(e); i2.setevent(e); List itemlist = new ArrayList() ; itemlist.add(i); itemlist.add(i2); e.setitemlist(itemlist); List guestlist = new ArrayList() ; guestlist.add(g); guestlist.add(g2); e.setguestlist(guestlist); List eventlist = new ArrayList() ; eventlist.add(e); g.setevents(eventlist);

g2.setevents(eventlist); // Sauvegarde des associations ajoutées e = eservices.saveevent(e); System.out.println("Evènement modifié : " + e.gettitle()); public static void testsaveevent() { // Voir implémentation ci-dessus public static void testconnectuser() { // Voir implémentation au chapitre précédent public static void testgetuserbylogin() { // Voir implémentation au chapitre précédent public static void testsaveuser() {

Powered by TCPDF (www.tcpdf.org) Enregistrer un nouvel évènement // Voir implémentation au chapitre précédent L'ensemble des entités rendues persistantes peuvent être parcourues avec l'outil PhpMyAdmin fourni par WampServer. La récupération des évènements depuis la base de données constitue justement la prochaine fonctionnalité que nous devons implémenter. Mais avant cela, prenons tout d'abord le temps de découvrir et comprendre l'importance d'un nouveau design pattern : les Data Transfer Objects, souvent abrégés en DTO.