1. Références

2. Mise en place

2.1. Instructions pour Eclipse

Suivre la procédure précédente pour la création d’un projet Web Application.

Dans la section "Configuration", cliquer sur Modify. Dans la popup qui s’ouvre, sélectionner JPA - la version dépend de la version de TomEE.

Dynamic Web Project - Project Facets

Puis cliquer sur OK et continuer la création comme précédemment.

Une nouvelle étape de configuration apparaît dans le flux de l’assistant, JPA Facet. Cette étape permet de référencer le JAR qui contient l’API JPA à la compilation. Remplir les champs ainsi :

Champ Valeur

Platform

Generic 2.x

JPA implementation type

User library

Persistent class management

Annotated classes must be listed in persistence.xml

Dans la section JPA implementation, cliquer sur le bouton de bibliothèque. Dans la fenêtre pop-up :

  1. Cliquer sur New…​ pour créer une nouvelle bibliothèque utilisateur. L’appeler JPA.

  2. Cliquer sur le Add External JARs…​ pour référencer le JAR qui contient l’API JPA. Il s’agit du JAR javaee-api-x.y.z.jar situé dans le répertoire lib de TomEE.

    Configuration de la bibliothèque JPA
  3. Finalement, cliquer sur Apply and Close.

Dans la fenêtre, sélectionner la librairie nouvellement créée.

Dynamic Web Project - JPA Facet

Cliquer sur Next et terminer la configuration. Le projet doit être similaire à la structure suivante :

Projet créé

2.2. Instructions pour IntelliJ IDEA

Suivre la procédure précédente pour la création d’un projet Web Application.

Cocher également la case Java EE persistence. Indiquer les valeurs suivantes :

  • persistence.xml : 2.1

  • OpenJPA (il s’agit du moteur de persistence fourni par TomEE)

New Project - JPA

Dans la section Library, cliquer sur Create. Dans la popup, sélectionner le JAR openjpa-2.4.x.jar.

Ce JAR est situé dans le répertoire lib du répertoire d’installation de TomEE.

Le projet créé doit avoir une structure similaire à la suivante :

Project has been created

2.3. Base de données

La base de données utilisée est HyperSQL (ou HSQLDB). Il s’agit d’une base de données très légère disponible au format JAR, qui contient le moteur d’exécution, le pilote JDBC ainsi qu’une console d’administration très simple. Il est disponible dans le répertoire TomEE.

L’avantage d’HSQLDB est d’être indépendant de toute installation externe.

2.3.1. Configuration de la source de données

Dans le cadre d’un projet réel, il est nécessaire de créer une source de données explicite.

Dans le cadre du TP et pour des raisons de simplification, nous allons utiliser la source de données HSQLDB par défaut de TomEE. Son emplacement dépend de plusieurs critères, notamment de l’IDE, du système d’exploitation, etc.

Par exemple, avec IntelliJ IDE sous OSX, elle est située dans $HOME/Library/Caches/IntelliJIdea2017.2/tomcat/Unnamed_jpa/data/hsqldb/hsqldb

Trouver l’emplacement de la base de données sur le système de fichiers
  1. Créer un nouveau servlet

  2. Injecter la source de données par défaut

    @Resource
    private DataSource dataSource
  3. Implémenter la méthode doGet

  4. Mettre un point d’arrêt dans la méthode (ou dans la signature)

  5. Appeler le servlet

  6. Evaluer l’expression dataSource

  7. L’URL est visible dans la feuille d’une des branches de la hiérarchie des objets (dataSource.delegate.pool.poolProperties.h.delegate.url)

    Data source object hierarchy value

2.3.2. Création automatisée du schéma

De même, dans le cadre d’un projet réel, il serait pertinent de créer le schéma de base de données a priori via les scripts DDL appropriés.

Dans le cadre du TP, il est suffisant de déléguer cette opération à OpenJPA. Dans le fichier persistence.xml, ajouter une propriété supplémentaire :

persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit ...>
        ...
        <properties>
            <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema" />
        </properties>
    </persistence-unit>
</persistence>

2.3.3. Logging

Afin de pouvoir d’analyser les problèmes qui risquent d’apparaître dans l’utilisation d’OpenJPA, il est possible (et souhaitable) d’activer les logs. Pour ce faire, il faut juste ajouter une propriété supplémentaire dans le fichier persistence.xml :

persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit ...>
        ...
        <properties>
            <property name="openjpa.Log" value="DefaultLevel=TRACE, Tool=INFO" />
        </properties>
    </persistence-unit>
</persistence>

2.3.4. Visualisation des données

Pour vérifier l’état de la base, il est possible d’utiliser l’application contenue dans le JAR d’HSQLDB. Pour ce faire, double-cliquer sur le JAR.

Connection à HSQLDB

Remplir les champs ainsi :

Champ  Valeur

Type

HSQL Database Engine In-Memory

Driver

org.hsqldb.jdbc.JDBCDriver

URL

jdbc:hsqldb:file:<path/to/hsqldb>

User

SA

Password

Puis, cliquer sur Ok.

  • Le volet de gauche affiche les tables et les propriétés.

  • Le volet du haut permet d’écrire des requêtes SQL.

  • Le volet du bas affiche les résultats.

Console HSQLDB

Le fichier HSQLDB ne peut être utilisé que par un seul processus à la fois avec le protocole jdbc:hsqldb:file. Cela implique que si TomEE est démarré, il n’est pas possible d’utiliser la console (et vice-versa).

3. Manipulation de l’API JPA

L’objectif de cette section est de lire et d’écrire un entité depuis un servlet depuis & vers la base de données.

3.1. Implémentation du modèle

Créer une entité Book qui comprend les propriétés suivantes :

Propriété Type

id

long

title

String

isbn

String

author

String

publicationDate

Date

  1. Créer une classe Book avec les champs adéquats

  2. La modifier pour en faire une entité JPA

  3. Choisir l’identifiant de manière adaptée

3.2. Contraintes sur la conception

Un certain nombre de raccourcis ont été pris dans le cadre du cours afin de rester dans la limite du volume horaire fixé. En particulier, la notion de transaction n’a pas été abordée. Un contexte transactionnel est en général nécessaire pour utiliser JPA. Contrairement aux servlets, les EJB sont des composants qui proposent un tel contexte par défaut.

Il est donc nécessaire d’adopter la conception suivante :

servlet ejb em

Cela se traduit dans le code ainsi :

@Stateless
public class MyService {

    // Reference the entity manager
}

public class MyServlet extends HttpServlet {

    /** Reference the EJB. */
    @EJB
    private MyEjb myEjb;
}

3.3. Implémentation du service

Dans la classe de service, implémenter les deux méthodes suivantes :

  1. public void save(Book book)

  2. public List<Book> readAll()

3.4. Implémentation du contrôleur

Le processus général à implémenter est le suivant :

jsp servlet ejb
Alternatives
  1. Ne pas implémenter display.jsp et écrire directement dans le flux de réponse via le servlet

  2. Ne pas implémenter form.jsp et appeler le servlet via un logiciel spécifique p.e. Postman