d3:tp06

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
d3:tp06 [2025/10/12 20:25] – [D3-TP06 : Projet "Gestion de clients" - Persistence des données avec un ORM - JPA de Payara] dthevenotd3:tp06 [2025/10/13 14:52] (Version actuelle) – [1-La datasource] dthevenot
Ligne 1: Ligne 1:
 +~~SLIDESHOW~~
 +
 ====== D3-TP06 : Projet "Gestion de clients" - Persistence des données avec un ORM - JPA de Payara ====== ====== D3-TP06 : Projet "Gestion de clients" - Persistence des données avec un ORM - JPA de Payara ======
 <bootnote warning>On travaille sur une **copie du projet "Gestion de clients"** en jakarta EE</bootnote> <bootnote warning>On travaille sur une **copie du projet "Gestion de clients"** en jakarta EE</bootnote>
 ===== ORM ===== ===== ORM =====
 Un ORM (Object-Relational Mapping / mapping objet-relationnel) est un ensemble de bibliothèques permettant de mapper (faire correspondre) les structures de données orientées objet d'un langage de programmation avec les tables d'une base de données relationnelle. L'objectif est de simplifier et d'abstraire les opérations de base de données pour le développeur, en permettant de manipuler les données comme s'il s'agissait d'objets dans le langage de programmation choisi. Un ORM (Object-Relational Mapping / mapping objet-relationnel) est un ensemble de bibliothèques permettant de mapper (faire correspondre) les structures de données orientées objet d'un langage de programmation avec les tables d'une base de données relationnelle. L'objectif est de simplifier et d'abstraire les opérations de base de données pour le développeur, en permettant de manipuler les données comme s'il s'agissait d'objets dans le langage de programmation choisi.
 +=====  =====
 L'ORM offre plusieurs avantages significatifs : L'ORM offre plusieurs avantages significatifs :
  
Ligne 12: Ligne 14:
 ===== JPA ===== ===== JPA =====
 JPA est un acronyme qui signifie **Java Persistence API**. C'est évolution de l'approche JDBC classique (“API bas niveau” : classe Connexion, ClientMysql avec Statement, ResultSet etc.) → **API standard pour l’utilisation d’un ORM** JPA est un acronyme qui signifie **Java Persistence API**. C'est évolution de l'approche JDBC classique (“API bas niveau” : classe Connexion, ClientMysql avec Statement, ResultSet etc.) → **API standard pour l’utilisation d’un ORM**
 +=====  =====
 ==== 1-La datasource ==== ==== 1-La datasource ====
 Dans Payara il faut une **DataSource JDBC jdbc/bdclient pointant vers ta base MariaDB**. Dans Payara il faut une **DataSource JDBC jdbc/bdclient pointant vers ta base MariaDB**.
  
 Définir la ressource JNDI sur ton serveur Définir la ressource JNDI sur ton serveur
 +<bootnote>JNDI signifie Java Naming and Directory Interface, cette API permet :
 +  * d’accéder à différents services de nommage ou de répertoire de façon uniforme ;
 +  * d'organiser et rechercher des informations ou des objets par nommage (java naming and directory interface) ;
 +  * de faire des opérations sur des annuaires (java naming and directory interface)
 +</bootnote>
 +=====  =====
   - Aller sur : http://localhost:4848   - Aller sur : http://localhost:4848
   - Menu : Resources → JDBC → JDBC Connection Pools   - Menu : Resources → JDBC → JDBC Connection Pools
Ligne 22: Ligne 30:
     - Pool Name : MonPoolMariaDB     - Pool Name : MonPoolMariaDB
     - Resource Type : javax.sql.DataSource     - Resource Type : javax.sql.DataSource
-    - Classname : org.mariadb.jdbc.MariaDbDataSource 
     - Database Vendor : MySQL (MariaDB est compatible MySQL)     - Database Vendor : MySQL (MariaDB est compatible MySQL)
     - Next     - Next
 +    - Classname : org.mariadb.jdbc.MariaDbDataSource
     - Propriétés additionnelles :{{:promo_2026:sio2:slam:d3:ppespoolmariadbgestionclient.png?600|}}     - Propriétés additionnelles :{{:promo_2026:sio2:slam:d3:ppespoolmariadbgestionclient.png?600|}}
     - Finish     - Finish
 +=====  =====
 <badge>Ping : OK ! **OBLIGATOIRE**</badge> <badge>Ping : OK ! **OBLIGATOIRE**</badge>
-<bootnote>JNDI signifie Java Naming and Directory Interface, cette API permet : +=====  =====
-  * d’accéder à différents services de nommage ou de répertoire de façon uniforme ; +
-  * d'organiser et rechercher des informations ou des objets par nommage (java naming and directory interface) ; +
-  * de faire des opérations sur des annuaires (java naming and directory interface) +
-</bootnote>+
 Créer la JDBC Resource (source de données JDBC) : Créer la JDBC Resource (source de données JDBC) :
   - Menu : Resources → JDBC → JDBC Resources   - Menu : Resources → JDBC → JDBC Resources
Ligne 40: Ligne 45:
     - Pool Name : monPoolMariaDB     - Pool Name : monPoolMariaDB
     - Clique sur OK     - Clique sur OK
 +=====  =====
 ==== 2-Configurer la persistence avec JPA ==== ==== 2-Configurer la persistence avec JPA ====
 === a) Les dépendances JPA === === a) Les dépendances JPA ===
Ligne 59: Ligne 65:
     </dependency>     </dependency>
 </code> </code>
 +=====  =====
 === b) persistence.xml === === b) persistence.xml ===
 Ce fichier indique à JPA comment se connecter à la base de données. Ce fichier indique à JPA comment se connecter à la base de données.
Ligne 77: Ligne 84:
   </persistence-unit>   </persistence-unit>
 </code> </code>
 +=====  =====
 ==== Les transactions ==== ==== Les transactions ====
 __Rappel__ :Une transaction est une série d’actions qui doivent toutes se terminer avec succès, sinon toutes les modifications apportées à chaque action sont annulées. Les transactions se terminent par une validation ou une annulation. __Rappel__ :Une transaction est une série d’actions qui doivent toutes se terminer avec succès, sinon toutes les modifications apportées à chaque action sont annulées. Les transactions se terminent par une validation ou une annulation.
Ligne 87: Ligne 95:
  
 En règle générale, le conteneur commence une transaction immédiatement avant le démarrage d’une méthode et valide la transaction juste avant la fermeture de la méthode. Chaque méthode peut être associée à une seule transaction. Les transactions imbriquées ou multiples ne sont pas autorisées dans une méthode. En règle générale, le conteneur commence une transaction immédiatement avant le démarrage d’une méthode et valide la transaction juste avant la fermeture de la méthode. Chaque méthode peut être associée à une seule transaction. Les transactions imbriquées ou multiples ne sont pas autorisées dans une méthode.
 +=====  =====
   * RESOURCE_LOCAL – mode application-managed   * RESOURCE_LOCAL – mode application-managed
 Utilisé dans les applis standalone (Java SE, Spring Boot sans conteneur JEE). Les transactions sont gérées par le code (ex : getTransaction(), begin(), commit()). Utilisé dans les applis standalone (Java SE, Spring Boot sans conteneur JEE). Les transactions sont gérées par le code (ex : getTransaction(), begin(), commit()).
Ligne 95: Ligne 103:
     <jta-data-source>jdbc/bdclient</jta-data-source>     <jta-data-source>jdbc/bdclient</jta-data-source>
 </bootnote> </bootnote>
 +=====  =====
 ==== L'EJB ==== ==== L'EJB ====
-EJB est une spécification Java pour créer des composants métier côté serveur, qui permettent de gérer automatiquement:+EJB (Enterprise Java Bean) est une spécification Java pour créer des composants métier côté serveur, qui permettent de gérer automatiquement:
   * La logique métier (ex : traitement de commandes, calculs…)   * La logique métier (ex : traitement de commandes, calculs…)
   * La sécurité   * La sécurité
   * La transaction   * La transaction
   * La concurrence   * La concurrence
 +=====  =====
 Types principaux d’EJB Types principaux d’EJB
   - **Stateless (@Stateless)** :   - **Stateless (@Stateless)** :
Ligne 113: Ligne 122:
     - Une seule instance partagée pour tous les clients.     - Une seule instance partagée pour tous les clients.
     - Exemple : compteur global ou cache partagé.     - Exemple : compteur global ou cache partagé.
 +=====  =====
 ==== 3-Créer l’entité Client utilisable par la JPA  ==== ==== 3-Créer l’entité Client utilisable par la JPA  ====
 Une entité JPA est très proche d’une classe java Bean (Client), mais avec quelques annotations supplémentaires pour que JPA sache comment la relier à la base de données. Une entité JPA est très proche d’une classe java Bean (Client), mais avec quelques annotations supplémentaires pour que JPA sache comment la relier à la base de données.
Ligne 119: Ligne 129:
   * "New > Entity Class" : création de l'entité à la main, définition des attributs, des annotations (@Entity, @Id, etc.) et de la correspondance avec la table.   * "New > Entity Class" : création de l'entité à la main, définition des attributs, des annotations (@Entity, @Id, etc.) et de la correspondance avec la table.
   * "New > Entity Classes from Database" : NetBeans génère automatiquement les classes d’entités à partir de la base existante (via la connexion JDBC).   * "New > Entity Classes from Database" : NetBeans génère automatiquement les classes d’entités à partir de la base existante (via la connexion JDBC).
 +=====  =====
 Nous allons créer l'entity JPA manuellement pour avoir l'équivalent de la classe Client : Nous allons créer l'entity JPA manuellement pour avoir l'équivalent de la classe Client :
 <code ruby entité Client> <code ruby entité Client>
Ligne 171: Ligne 181:
 } }
 </code> </code>
 +=====  =====
 <badge>Comparaison</badge> <badge>Comparaison</badge>
 ^Élément ^Classe Java simple ^Classe JPA Entity^ ^Élément ^Classe Java simple ^Classe JPA Entity^
Ligne 178: Ligne 189:
 |Constructeur vide|Optionnel|Obligatoire| |Constructeur vide|Optionnel|Obligatoire|
 |Gestion SQL |Fait à la main (JDBC)|Automatique (via EntityManager)| |Gestion SQL |Fait à la main (JDBC)|Automatique (via EntityManager)|
 +=====  =====
 ==== 4-Créer un DAO  ==== ==== 4-Créer un DAO  ====
 La classe java **ClientMysql** est un DAO (Data Access Object) en mode **JDBC classique** (Connection, Statement, ResultSet, etc.) La classe java **ClientMysql** est un DAO (Data Access Object) en mode **JDBC classique** (Connection, Statement, ResultSet, etc.)
Ligne 206: Ligne 218:
 } }
 </code> </code>
 +=====  =====
 <badge>Comparaison</badge> <badge>Comparaison</badge>
 ^Action ^JDBC (ClientMysql) ^JPA (ClientJpa)^ ^Action ^JDBC (ClientMysql) ^JPA (ClientJpa)^
Ligne 213: Ligne 226:
 |Gestion des transactions |Manuelle (implémentée ou pas) |Automatique via em.getTransaction()| |Gestion des transactions |Manuelle (implémentée ou pas) |Automatique via em.getTransaction()|
 |Fermeture |stmt.close(), resultSet.close() |em.close()| |Fermeture |stmt.close(), resultSet.close() |em.close()|
 +=====  =====
 <badge>A retenir</badge> <badge>A retenir</badge>
 ^Notion ^Explication^ ^Notion ^Explication^
Ligne 225: Ligne 238:
 | | |SELECT c signifie : « prends tous les clients ».| | | |SELECT c signifie : « prends tous les clients ».|
 | | |Client.class indique le type de retour attendu : ici, chaque résultat sera un objet Client.| | | |Client.class indique le type de retour attendu : ici, chaque résultat sera un objet Client.|
 +=====  =====
 ==== 5-Adaptation de l'application : Création d'un client avec JPA  ==== ==== 5-Adaptation de l'application : Création d'un client avec JPA  ====
 === Modification de la classe NouveauClientForm === === Modification de la classe NouveauClientForm ===
Ligne 260: Ligne 273:
 } }
 </code> </code>
 +=====  =====
 <bootnote>La classe Client utilisée est maintenant l'entité JPA créée précédemment</bootnote> <bootnote>La classe Client utilisée est maintenant l'entité JPA créée précédemment</bootnote>
 === Modification de la servlet NouveauServlet.java === === Modification de la servlet NouveauServlet.java ===
Ligne 269: Ligne 283:
  
 <badge> Jalon : montrer la création d'un client ainsi modifiée en version JPA</badge> <badge> Jalon : montrer la création d'un client ainsi modifiée en version JPA</badge>
 +=====  =====
 ==== 6-TP: faire évoluer tout le projet "Gestion de clients" en JPA ==== ==== 6-TP: faire évoluer tout le projet "Gestion de clients" en JPA ====
  
  • d3/tp06.1760293533.txt.gz
  • Dernière modification : 2025/10/12 20:25
  • de dthevenot