Le rendu de ce TP sera intégré avec le rendu du TP suivant (application forum).
javax.persistence
Ce TP est à développer sur la base du TP précédent.
Ajouter les dépendances suivantes dans le fichier pom.xml
1):
<dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>3.4.0.GA</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.6.1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.1</version> <type>jar</type> <scope>compile</scope> </dependency>
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:
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="pu" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/> <property name="hibernate.hbm2ddl.auto" value="validate"/> <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver"/> <property name="hibernate.connection.username" value="xxx"/> <!-- votre login Oracle ici --> <property name="hibernate.connection.password" value="xxx"/> <!-- votre mot de passe Oracle ici --> <property name="hibernate.connection.url" value="jdbc:oracle:thin:@//pedagowin710:1521/orapeda1"/> <!-- changer pedagowin710 en localhost et orapeda1 en xe pour utiliser Oracle eXpress Edition --> </properties> </persistence-unit> </persistence>
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.
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<Membre> 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.
→ Créer un modèle objet correspondant au modèle relationnel du PL/SQL.
On implémentera alors des méthodes pour:
createNativeQuery
de la classe EntityManager
.On s'attachera à étudier les différentes options2) 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 JUnit3). 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() { .... } }