Rest sur Tomcat, Leçon 3 : Persistance avec OpenJPA

18 août 2013 14:27 root Java, MySQL, OpenJPA, Resteasy, Tomcat

Bonjour.

Dans le précédent article, les messages posté était enregistrer dans une simple List. Aujourd'hui on va voir comment enregistrer ces messages dans une base de donnée MySQL à l'aide d'OpenJPA.

Ajout d'OpenJPA au pom.xml

J'ai vraiment horreur de maven, mais bon. Commençons donc par ajouté OpenJPA et un connecteur Jdbc au projet.

<dependency>
  <groupId>org.apache.openjpa</groupId>
  <artifactId>openjpa-all</artifactId>
  <version>2.2.2</version>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.25</version>
  <scope>runtime</scope>
</dependency>

Création du fichier persistance.xml

à placer dans /src/main/webapp/WEB-INF/classes/META-INF. Ce fichier permet de définir à la fois la connexion à la base de donnée, mais également la liste des beans accessible par OpenJPA. Ici la configuration est faite de manière à ce que les table soit généré automatiquement.

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
  <persistence-unit name="tuto-bdd" transaction-type="RESOURCE_LOCAL">
    <class>bean.Message</class>
    <properties>
      <property name="openjpa.ConnectionURL"
value="jdbc:mysql://localhost:3306/YOUR_BDD?autoReconnect=true" />
      <property name="openjpa.ConnectionUserName" value="YOUR_LOGIN" />
      <property name="openjpa.ConnectionPassword" value="YOUR_PASS" />
      <property name="openjpa.ConnectionDriverName" value="org.gjt.mm.mysql.Driver" />
      <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema" />
      <property name="openjpa.RuntimeUnenhancedClasses" value="supported" />
    </properties>
  </persistence-unit>
</persistence>

Décoration du bean

Maintenant il faut décorer notre précédent bean pour lui permettre d'être enregistrer en BDD. Rien de bien sorcier la non plus. On ajoute au passage un identifiant unique avec une valeur auto générée.

@Entity
public class Message {

    @Id
    @GeneratedValue
    private long id;

    [...]

    public long getId() {
        return id;
    }

}

Mise à jour du service

OpenJPA est une implémentation de JPA, La classe Persistence permet d'initialiser la classe EntityManagerFactory. Généralement le but est de n'avoir qu'une seule instance de ce Factory dans toute l'application. Ici je cherche avant tous à faire simple, je la stock en static à la bourrin, c'est pas le but de ce tuto. L'argument donné en paramètre est le nom de l'unité de persistance décrite dans le fichier persistence.xml.

Grâce à cet "emf" on peu créer un EntityManager "em". Cet objet est en quelque sorte notre connexion à la base de donnée. Comme le code parle mieux qu'un discourt je vous laisse découvrir par l'exemple :

@Path("/messages")
public class MessageService {

    private static final EntityManagerFactory EMF =
Persistence.createEntityManagerFactory();

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Message postMessage(Message message) {
        EntityManager em = EMF.createEntityManager();
        em.getTransaction().begin();
        em.persist(message);
        em.getTransaction().commit();
        em.close();
        return message;
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Message> getMessages() {
        EntityManager em = EMF.createEntityManager();
        TypedQuery<Message> q = em.createQuery("SELECT m FROM Message m ORDER  BY m.creation DESC", Message.class);
        List<Message> messages = q.getResultList();
        em.close();
        return messages;
    }

}

Ici pour sélectionner les objets nous utilisons un langage qui ressemble à SQL appelé JPQL (Java Persistance Query Language). Mais il existe également une API permettant de construire les requêtes avec des objets. Plus simple à débugger, car dès la compile vous savez si vous êtes bon ou pas. J'en parlerais peut être dans un autre tuto.

Normalement des le lancement de votre webapp, vous devriez voir des tables se créer toutes seules dans votre base :] [gallery ids="1751"] Simple tous cela, mais comment couvrir ce code sans base de donnée ? Nous verrons cela lors d'un prochain tuto en utilisant HSQL.

Édition du 07/12/2013 : mise en forme des codes qui en avaient besoin

par Shionn, dernière modification le 29 décembre 2013 19:13
0 réflexions au sujet de « Rest sur Tomcat, Leçon 3 : Persistance avec OpenJPA »

Laissez un commentaire

Vous pouvez utilisez du markdown pour la mise en forme

Votre adresse de messagerie ne sera pas publiée.

Temporairement, pour lutter contre les bots, il n'est pas permis de mettre http:// dans le commentaire.