Ceci est une ancienne révision du document !


Mise en oeuvre de mappings Objet/Relationnels

Modalités de rendu

  • Ce TP sera à rendre pour le dimanche 21/10/2012 par dépôt sur la page Spiral suivante: Zone de dépôt.
  • Il est demandé de rendre un zip du projet maven, sans le répertoire target. Bien penser à remplir le fichier etudiants.txt. Il est possible d'ajouter dans ce fichier tout commentaire à destination du correcteur.
  • Un rendu par binôme, trinômes interdits.
  • On précisera dans le fichier etudiants.txt si le TP a été réalisé avec PostgreSQL ou bien avec Oracle.

Introduction

L'objectif de ce TP est de mettre en place un mapping Objet/Relationnel via l'API JPA.

Quelques liens:

Schema relationnel

On considère le schéma relationnel fourni dans un des fichiers suivants (selon le SGBD choisi): schema PostgreSQL, schema Oracle

Utiliser le script choisi pour créer les tables:

  • soit dans le schéma public de la base postgres du serveur postgresql installé sur votre machine (rappel serveur: localhost, base: postgres, login: etudiant, mdp: etudiant)
  • soit dans votre compte Oracle (voir tomusss.univ-lyon1.fr pour le login)
    • dans ce cas, il sera nécessaire télécharger en plus le fichier ojdbc6.jar et d'exécuter la commande suivante (commande sous Linux/Mac, à adapter sous Windows) en remplaçant mon_repertoire par le répertoire où se trouve le fichier ojdbc6.jar:
      mvn install:install-file  -Dfile=mon_repertoire/ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc -Dversion=6 -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true

Projet embryonnaire

Maven est un utilitaire de compilation/exécution/test de projet Java qui sera utilisé dans le cadre des TP de l'UE. Configurer Maven comme indiqué dans l'aide.

Télécharger et décompresser le projet de base: bdav-tp-orm-base.zip, ou mieux, cloner le dépôt créé mardi matin.

hg clone https://forge.univ-lyon1.fr/hg/mif18-tp-base

Un projet Maven possède deux répertoires de sources: src/main et src/test. Le premier contient les classes “métier” alors que le second ne contient que le code de test.

Dans Eclipse, il faut importer le projet en utilisant Import existing maven project.

Le fichier pom.xml contient les dépendances sur les bibliothèques nécessaires au TP.

Le fichier src/main/resources/META-INF/persistence.xml contient les informations pour mettre en place le cadre de persistence:

<?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.PostgreSQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="validate"/>
            <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
            <property name="hibernate.connection.username" value="etudiant"/> 
            <property name="hibernate.connection.password" value="etudiant"/> 
            <property name="hibernate.connection.url" value="jdbc:postgresql:postgres"/> 
        </properties>
    </persistence-unit>
</persistence>

Si la connection de fonctionne pas, changer mdpetu en etudiant.

Travail demandé

  1. Concevoir un modèle objet correspondant au modèle relationnel fourni et créer des classes Java correspondantes.
  2. Annoter les classes via des annotations du package javax.persistence, afin d'établir les liens entre le modèle relationnel et votre modèle objet.

Remarques additionnelles

Tester le mapping

Le mapping relationnel objet peut être tester à travers le TestCase JUnit suivant:

package bdav.tporm;
 
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();
	}
 
}

Cette classe est à placer dans le répertoire src/test/java/bdav/tporm. Elle est exécutable directement comme test JUnit dans Eclipse ou Netbeans.

Divers

  • Lorsqu’une entité/classe possède un identifiant portant sur plusieurs attributs, il faut créer une classe spécifique (qui n'est pas une entité) pour regrouper ces champs, et utiliser un champ de cette classe en lieu et place du groupe de champs servant d'identifiants dans votre modèle objet. Voir @Id, @IdClass.
  • Lorsque certaines tables ne correspondent pas nécessairement à une entité, il est possible d'utiliser les annotations @Embedded et @Embeddable.
  • Les colonnes de type xml peuvent être mise en correspondance avec des colonnes de type String
  • Changer hibernate.hbm2ddl.auto de validate à update permet au framework de modifier le schéma relationnel. Cela peut être utile pour comprendre à quoi correspond le mapping en cours de développement, mais cela écrase le schéma de l'énoncé. A la fin du TP, le mapping doit fonctionner avec le schéma de fourni plus haut. En cas d'impossibilité, justifier les différences dans des commentaires appropriés dans les classes Java.