- Tutoriel Java EE -
Persistance des données et premiers EJBs

Dans la suite de cette page, les instructions que vous devez suivre sont indiquées comme suit :

instructions à suivre !

Introduction

Vous venez de configurer l'accès à la base de données en définissant une source de données JDBC et une unité de persistance pour l'EntityManager de JPA. Vous allez maintenant pouvoir utiliser JPA pour rendre les données de votre application persistantes. Cela se fera en deux étapes :

  1. Création des EJBs Entity qui servent à stocker les données et à indiquer la correspondance entre les objets et les données dans la base ;
  2. Utilisation de l'EntityManager qui permet d'intérroger la base de données.

Création d'un EJB Entity à partir d'un JavaBeans

Dans cette étape, nous allons transformer le JavaBean Product en EJB Entity. Une fois cela fait, vous pourrez utiliser l'EntityManager pour réaliser deux principaux types d'opérations :

EJB Entity et correspondance avec une table de la base

Annoter la classe Product @Entity pour indiquer que c'est un EJB Entity.

Il faut maintenant définir la correspondance entre la classe Product et les données qui se trouvent dans la base.

Indiquer avec l'annotation @Table(name = "nom_de_la_table") dans quelle table sont stockées les données concernant les produits.

Pour savoir quelle table contient les données des produits, aller dans l'onglet Services > Bases de données de NetBeans et faites apparaitre le contenu de la base de données eMarket via jdbc:derby://localhost:1527/eMarket.

Correspondance des attributs de l'EJB avec les colonnes de la table

Vous devez maintenant annoter votre classe Product de manière à établir une correspondance entre les attributs de cette classe et les colonnes de la table PRODUCT.

Toujours l'onglet Services > Bases de données, faites apparaître la structure de la table PRODUCT. Celle-ci est normalement constituée de 3 colonnes :

Vérifier si les noms des attributs de votre classe Produit correspondent aux noms des colonnes de la table. Si ce n'est pas le cas, vous devez obligatoirement ajouter des annotations @Column(name = "nom_colonne") sur tous ces attributs afin que le serveur puisse faire automatiquement la correspondance et stocker les données dans les bonnes colonnes.

Ajouter une annotation @Id sur l'attribut identifiant les produits dans la classe Product. Cette annotation assure la correspondance avec la clé primaire de la table.

Pour que l'identifiant des produits soit automatiquement généré par la base de données (incrémentation d'un compteur entier), ajouter l'annotation @GeneratedValue(strategy = GenerationType.SEQUENCE) .

Création d'un EJB Session Facade

Patron Facade

Un principe de bonne conception général en génie logiciel consiste à ne jamais faire appel directement à la couche d'accès aux données dans les objets métier. Concrètement, dans le cadre de ce tutoriel, cela signifie qu'il est déconseillé d'utiliser l'EntityManager directement dans les autres composants de l'application (ManagedBeans JSF, JavaBeans...).

Pour faire appel à l'EntityManager, nous allons appliquer le patron "façade" et passer par un EJB Session Stateless qui jouera le rôle d'intermédiaire (le rôle de "façade" donc).

Génération d'un EJB Session Facade pour l'EJB Entity Product

Créer un package java "facade" dans le répertoire "Sources" du projet.

Aller dans le menu File > New File > Persistence puis choisir l'assistant Session Beans for Entity Classes comme indiqué sur la figure ci-dessous :

Création d'un EJB Session Facade - Etape 1

Dans la liste des "Entity Classes", sélectionner model.Product et cliquer sur le bouton Add > pour le faire passer dans la colonne de droite comme indiqué sur la figure ci-dessous :

Création d'un EJB Session Facade - Etape 2

Choisissez le package "facade" que vous venez de créer puis cliquez sur "Finish".

Création d'un EJB Session Facade - Etape 3

NetBeans génère pour vous deux classes :

Requêtes en utilisant l'EJB Session Facade dans un ManagedBean

Récupération des produits stockés dans la base de données

Injecter l'EJB ProductFacade dans le CatalogManager en utilisant l'annotation @EJB.


@EJB
private ProductFacade productfacade;

Ne pas oublier de créer les accesseurs pour ce nouvel attribut.

Grâce au principe de l'injection dans Java EE, il n'est absolument pas nécessaire d'initialiser un attribut correspondant à un composant injecté. Pas d'appel au constructeur donc ! C'est le conteneur du serveur d'application qui se charge d'attribuer une instance du composant injecté à l'attribut correspondant.

Dans la méthode @PostConstruct du CatalogManager, utiliser la méthode "findAll" du ProductFacade pour récupérer les produits existants en base et ajouter les produits ainsi récupérés dans le catalogue (c'est-à-dire dans la liste des produits).

Vérifier que les produits s'affichent bien sur la page "catalog.xhtml"

Sauvegarde d'un nouveau produit dans la base de données

Dans la méthode createProduct du CatalogManager, utiliser la méthode "create" du ProductFacade pour sauvegarder le produit qui doit être ajouté au catalogue dans la base de données.

Testez l'ajout d'un produit ! Pour vérifier que le produit ajouté est bien sauvegardé en base, allez dans l'onglet Services > Bases de données et faites apparaître les données contenues dans la table PRODUCT comme indiqué dans l'étape de prise en main de l'environnement de développement.