M2

TD n°1 - Partie JPA

Suite du TD n°1 ; rajout de la partie JPA manquante.

Il faut créer une entity JPA qui permet de stocker les résultats dans une base de données. Il faut donc créer une nouvelle classe ; dans le projet de la calculatrice, il faut donc :

Création de l'entity

package Operation;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Resultat {
  @Id
  @GeneratedValue
  private int id;

  private int valeur;

  public Resultat() {

  }

  public Resultat(int id, int valeur) {
    this.valeur = valeur;
  }

  public int getId() {
    return this.id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public int getValeur() {
    return this.valeur;
  }

  public void setValeur(int valeur) {
    this.valeur = valeur;
  }
}

Création du persistence.xml

Pour trouver les valeurs à utiliser dans le fichier persistence.xml, il faut regarder dans le fichier [dossier Wildfly]/standalone/configuration/standalone.xml. Aux alentours de la ligne 147, il y a un tag XML datasources qui contient les datasources disponibles. Il suffit de reprendre les valeurs pour faire le fichier de persistence :

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

  <persistence-unit name="ExampleDS">
    <class>Operation.Resultat</class>

    <properties>
      <property name="javax.persistence.jdbc.driver"
          value="org.h2.jdbcDriver" />
      <property name="javax.persistence.jdbc.url"
          value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;create=true" />
      <property name="javax.persistence.jdbc.user"
          value="sa" />
      <property name="javax.persistence.jdbc.password"
          value="sa" />

      <property name="javax.persistence.schema-generation.database.action"
          value="create"/>
    </properties>
  </persistence-unit>
</persistence>

Le nom de la persistence-unit (première ligne surlignée) est importante car Wildfly va essayer de retrouver le data source par le biais de JNDI (de ce que j'ai compris).

La deuxième ligne surlignée permet de forcer la création automatique des tables. Puisque le datasource par défaut utilise une base de données stockée en mémoire, c'est ultra-chiant de créer le schéma soit même.

Sauvegarde au moment du calcul

Il faut d'abord essayer de récupérer une instance de l'entity manager. Il suffit de créer un attribut dans la classe et d'y ajouter une annotation :

@PersistenceContext(unitName="ExampleDS")
private EntityManager em;

Finalement, on peut sauvegarder le résultat :

public int ajouter(int a, int b) {
  int valeur = a + b;

  Resultat resultat = new Resultat();

  resultat.setValeur(valeur);
  em.persist(resultat);

  return valeur;
}