M2

Le but est de créer un projet JPA qui va intéragir avec une base de données HSQL. Il faut dans un premier temps, aller sur le Moodle de ce cours et télécharger :

Il faut ensuite décompresser les zips puis dans Eclipse, créer un nouveau projet JPA. Il faut ensuite configurer le projet en faisant clique droit dessus et en allant dans Properties puis dans Java Build Path.

Il faut ensuite importer :

Ensuite, il faut créer l'entity en elle même en créant une nouvelle classe Java :

package cours;

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

@Entity
public class Employe {
  @Id
  private int id;

  private String nom;
  private double salaire;

  public Employe() {
    super();
  }

  public Employe(int id, String nom, double salaire) {
    this.id      = id;
    this.nom     = nom;
    this.salaire = salaire;
  }

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

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

  public String getNom() {
    return this.nom;
  }

  public void setNom(String nom) {
    this.nom = nom;
  }

  public double getSalaire() {
    return this.salaire;
  }

  public void setSalaire(double salaire) {
    this.salaire = salaire;
  }
}

Il faut ensuite créer la classe de service qui permet de gérer les différentes actions à effectuer sur la base de données (c'est pas obligatoire, on pourrait tout claquer dans le main, osef) :

package cours;

import javax.persistence.EntityManager;

public class EmployeService {
  protected EntityManager em;

  public EmployeService(EntityManager em) {
    this.em = em;
  }

  public Employe createEmployee(int id, String nom, double salaire) {
    Employe employe = new Employe(id, nom, salaire);

    em.persist(employe);

    return employe;
  }

  public Employe findEmploye(int id) {
    return em.find(Employe.class, id);
  }
}

Il faut ensuite démarrer le serveur HSQL ; à la racine du dossier décompréssé, il faut taper dans un terminal ou une invite de commande Windaube :

$ java -cp lib/hsqldb.jar org.hsqldb.util.DatabaseManagerSwing

Ensuite, il faut éditer le fichier META-INF/persistence.xml dans Eclipse et le configurer pour permettre la connexion à la base de données :

<?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">

  <!-- Changer JPAWoulah avec le nom de votre projet Eclipse par exemple -->
  <persistence-unit name="JPAWoulah">
    <!-- Changer avec le nom de votre package et classe -->
    <class>cours.Employe</class>

    <properties>
      <property name="javax.persistence.jdbc.driver"
          value="org.hsqldb.jdbcDriver" />
      <property name="javax.persistence.jdbc.url"
          value="jdbc:hsqldb:mem:.;create=true" />
      <property name="javax.persistence.jdbc.user"
          value="SA" />
      <property name="javax.persistence.jdbc.password"
          value="" />
      <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
  </persistence-unit>
</persistence>

Note : Dans les valeurs données par le prof (fichier properties sur Moodle), l'adresse de connexion est différente mais en essayant de configurer HSQL pour qu'il utilise ces paramètres, j'ai une SQLTransientConnectionException et impossible de démarrer le serveur.

Du coup, le gros soucis c'est que cette configuration stocke la base de données en mémoire donc :

Il faudrait voir avec le prof pourquoi c'est autant de la merde ça marche pas.

Finalement, il faut créer le main pour tester le tout :

package cours;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class Main {

  public static void main(String[] args) {
    // Changer `JPAWoulah` avec le nom qui est mis au niveau
    // du `persistence-unit` dans le persistence.xml.
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAWoulah");
    EntityManager em = emf.createEntityManager();
    EmployeService service = new EmployeService(em);

    service.createEmployee(1, "Mouloud", 2200.56);

    Employe employe = service.findEmploye(1);

    System.out.println("L'employé " + employe.getId() + " a pour ...");
  }
}