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 :
- 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 ;
- 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 :
- la lecture des informations concernant les produits qui se trouvent stockées dans la base de données (i.e. aller chercher tous les produits, aller chercher un produit unique à partir de son nom...) ;
- la modification des informations concernant les produits qui se trouvent stockées dans la base de données (i.e. modifier un produit, ajouter un produit, supprimer un produit...).
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 :
- ID de type INT, qui est la clé primaire de la table, c'est-à-dire l'identifiant unique des produits
- NAME de type VARCHAR(255) c'est-à-dire une chaîne de caractères de 255 caractères maximum
- SELLING_PRICE de type DOUBLE
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 :

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 :

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

NetBeans génère pour vous deux classes :
- ProductFacade : c'est l'EJB façade que vous utiliserez pour accéder à la base de données. Il contient une référence à la PersistenceUnit qui a été créée précédemment, et il contient également une référence à l'EntityManager qui réalise les opérations d'accès à la base.
@Stateless public class ProductFacade extends AbstractFacade<Product> { @PersistenceContext(unitName = "eMarketPU") private EntityManager em; @Override protected EntityManager getEntityManager() { return em; } public ProductFacade() { super(Product.class); } }
Cet EJB ne contient aucune opération d'accès à la base car celles-ci sont factorisées dans la classe abstraite "AbstractFacade".
public T find(Object id) { return getEntityManager().find(entityClass, id); } public List<T> findAll() { javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); cq.select(cq.from(entityClass)); return getEntityManager().createQuery(cq).getResultList(); } public void create(T entity) { getEntityManager().persist(entity); } ...
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.