Ceci est une ancienne révision du document !


Mise en oeuvre de mappings Objet/Relationnels

Sujet en cours d'élaboration

Introduction

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

Quelques liens:

Schema relationnel

Le fichier orm-2013/initialisation-pg.sql du projet embryonnaire permet de mettre en place le schéma relationnel avec quelques données.

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: mif18-2013-base.zip, ou mieux le cloner depuis la forge:

hg clone https://forge.univ-lyon1.fr/hg/inf1008m-2013-base mif18-2013-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 projet peut être directement ou vert dans Netbeans.

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

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 placé dans src/test/java/bdav/orm/MappingTest.java. Cette classe 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 @EmbeddedId, @Embbedable.
  • Les annotations @Column, @JoinColumn, @JoinTable sont à utiliser dans le mapping
  • 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.
  • L'ordre suivant est suggéré dans la mise en place des classes et du mapping:
    • Classe Film sans association. On pourra utiliser/s'inspirer du code suivant:
      @Entity(name = "film")
      public class Film implements Serializable {
      	private static final long serialVersionUID = 1L;
       
      	@Id
      	@GeneratedValue(generator = "film_gen", strategy = GenerationType.SEQUENCE)
      	@SequenceGenerator(sequenceName = "film_seq", name = "film_gen")
      	private int id;
       
      	private String titre;
       
      	private int annee;
       
      	public String getTitre() {
      		return titre;
      	}
       
      	public void setTitre(String titre) {
      		this.titre = titre;
      	}
       
      	public int getAnnee() {
      		return annee;
      	}
       
      	public void setAnnee(int annee) {
      		this.annee = annee;
      	}
       
      	public int getId() {
      		return id;
      	}
       
       
      // Généré dans Eclipse via "Source" -> "Generate hashCode and equals ..."
      	@Override
      	public int hashCode() {
      		final int prime = 31;
      		int result = 1;
      		result = prime * result + annee;
      		result = prime * result + id;
      		result = prime * result + ((titre == null) ? 0 : titre.hashCode());
      		return result;
      	}
       
      	@Override
      	public boolean equals(Object obj) {
      		if (this == obj)
      			return true;
      		if (obj == null)
      			return false;
      		if (getClass() != obj.getClass())
      			return false;
      		Film other = (Film) obj;
      		if (annee != other.annee)
      			return false;
      		if (id != other.id)
      			return false;
      		if (titre == null) {
      			if (other.titre != null)
      				return false;
      		} else if (!titre.equals(other.titre))
      			return false;
      		return true;
      	}
      }
    • Classe Personne sans association
    • Classe Societe sans association
    • Association Film réalisé par Personne
    • Association Société produit Film
    • Classe Role (joue_dans) sans association
    • Associations liées à la classe Role