====== 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() { .... } }