====== TP: Mappings objets relationnels ======
Le rendu de ce TP sera intégré avec le rendu du TP suivant ([[tp-forum-app|application forum]]).
===== Liens =====
* [[http://java.sun.com/javaee/5/docs/api/|API JEE 5]] -> package ''javax.persistence''
* [[http://en.wikipedia.org/wiki/Java_Persistence_API|JPA]]
* [[https://www.hibernate.org/|Hibernate]]
* [[http://java.sun.com/javaee/5/docs/tutorial/doc/bnbpz.html|Tutoriel JPA]] en anglais
* [[:enseignement:aide:oracle|Connexion à la base Oracle]]
* {{:enseignement:bdav:bdav-orms.pdf|Transparents du cours ORM}}
===== Cadre de développement =====
Ce TP est à développer sur la base du [[tp-xml-rel|TP précédent]].
Ajouter les dépendances suivantes dans le fichier ''pom.xml''((réfléchir à l'endroit ou placer ce code dans le fichier)):
javax.persistence
persistence-api
1.0
jar
compile
org.hibernate
hibernate-entitymanager
3.4.0.GA
jar
compile
org.slf4j
slf4j-simple
1.6.1
jar
compile
org.slf4j
slf4j-api
1.6.1
jar
compile
Créer un répertoire ''src/main/resources/META-INF'' s'il n'existe pas dans votre projet. Si Eclipse est utilisé, effectuer un clic-droit sur le répertoire ''src/main/resources'' dans Eclipse puis //Build Path -> Use as source folder//. Dans le répertoire ''META-INF'' créé précédemment, créer un fichier ''persistence.xml'' sur le modèle suivant:
org.hibernate.ejb.HibernatePersistence
Ce fichier permet de configurer le gestionnaire d'entité.
Créer une classe de test pour la configuration du gestionnaire d'entité:
package epul.bdav.jpa;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import junit.framework.TestCase;
public class ConfigurationTest extends TestCase {
public void testEntityManager() {
EntityManager em = Persistence.createEntityManagerFactory("pu").createEntityManager();
em.getTransaction().begin();
em.getTransaction().commit();
em.close();
}
}
Lancer le test pour vérifier votre configuration.
===== Première utilisation =====
Créer une classe Membre sur le modèle suivant:
package epul.bdav.jpa;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
@Entity
public class Membre {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_gen")
@SequenceGenerator(name="seq_gen",sequenceName="SEQ_MEMBRE",allocationSize=1)
private Long id;
private String nom;
private String email;
private Long nb_interventions = 0L;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Long getNb_interventions() {
return nb_interventions;
}
public void setNb_interventions(Long nbInterventions) {
nb_interventions = nbInterventions;
}
}
On pourra ensuite s'inspirer du code suivant pour sauver/récupérer des membres:
EntityManager em =
Persistence.createEntityManagerFactory("pu").createEntityManager();
Membre toto = new Membre();
toto.setNom("Toto");
toto.setEmail("toto@nowhere.net");
em.getTransaction().begin();
em.persist(toto);
em.getTransaction().commit();
List lesMembres = em.createQuery("SELECT m FROM Membre m").getResultList();
for (Membre p : lesMembres) {
System.out.println("Nom: " + p.getNom()
+ ", email: " + p.getEmail()
+ ", id: " + p.getId());
}
Faire s'exécuter ce code dans un test, puis regarder le résultat dans votre compte.
===== Modèle objet =====
-> Créer un modèle objet correspondant au modèle relationnel du [[tp-plsql-jdbc|PL/SQL]].\\ On implémentera alors des méthodes pour:
* créer un utilisateur
* créer une salle
* envoyer un message
* envoyer une réponse
* clore un fil de discussion: on appellera la procédure stockée via la méthode ''createNativeQuery'' de la classe ''EntityManager''.
On s'attachera à étudier les différentes options((disponibles dans la documentation du package des annotations Java du ''javax.persitence'')) de configuration du mapping objet <-> relationnel et on justifiera les choix effectués. On souhaitera en particulier pouvoir naviger entre les différentes entités, par exemple pouvoir accéder à l'ensemble des messages d'une salle.
Les méthodes implémentées devront être testées via [[:enseignement:sw:apis|JUnit]]((attention à bien mettre les classes de test dans l'arborescence "test")). On pourra créer une classe de test sur ce modèle:
package epul.bdav.jpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import junit.framework.TestCase;
public class EntityTest extends TestCase {
private EntityManager em;
private EntityTransaction tr;
@Override
protected void setUp() throws Exception {
em = Persistence.createEntityManagerFactory("pu").createEntityManager();
tr = em.getTransaction();
tr.begin();
}
@Override
protected void tearDown() throws Exception {
tr.rollback();
em.close();
}
public void testCreationMembre() {
....
}
}