TP: Mappings objets relationnels

Le rendu de ce TP sera intégré avec le rendu du TP suivant (application forum).

Liens

Cadre de développement

Ce TP est à développer sur la base du TP précédent. Ajouter les dépendances suivantes dans le fichier pom.xml1):

    <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.

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<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.

Modèle objet

→ Créer un modèle objet correspondant au modèle relationnel du 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 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() {
           ....
	}
}
1)
réfléchir à l'endroit ou placer ce code dans le fichier
2)
disponibles dans la documentation du package des annotations Java du javax.persitence
3)
attention à bien mettre les classes de test dans l'arborescence “test”