Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
enseignement:tp:bd:tp-orm:2014 [2014/09/18 11:51]
ecoquery [Schema relationnel]
enseignement:tp:bd:tp-orm:2014 [2014/09/22 16:46] (Version actuelle)
ecoquery [Remarques additionnelles]
Ligne 37: Ligne 37:
  
  
-<note warning>Sur les machines des salles  TP, faire le TP sous Windows (les IDE sont mal installées sous linux)</note> 
  
 ===== Introduction ===== ===== Introduction =====
Ligne 63: Ligne 62:
 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. 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. Il est également possible d'utiliser IntelliJ.+Dans Eclipse, il faut importer le projet en utilisant ''Import existing maven project''. Le projet peut être directement ou vert dans Netbeans. Il est également possible d'utiliser IntelliJ en important le projet et en spécifiant d'utiliser un type de projet maven à l'import.
  
 <note warning>Le projet à utiliser est le projet orm-2014, disponible soit directement, soit le cas échéant dans les modules du projet ouvert</note> <note warning>Le projet à utiliser est le projet orm-2014, disponible soit directement, soit le cas échéant dans les modules du projet ouvert</note>
 +<note tip>Il est possible d'utiliser la ligne de commande plutot que l'IDE. Pour compiler et tester le mapping depuis le répertoire ''orm-2014'', faire:<code>mvn test</code></note>
  
 Le fichier ''pom.xml'' contient les dépendances sur les bibliothèques nécessaires au TP. Le fichier ''pom.xml'' contient les dépendances sur les bibliothèques nécessaires au TP.
Ligne 71: Ligne 71:
 Le fichier ''src/main/resources/META-INF/persistence.xml'' contient les informations pour mettre en place le cadre de persistance. Le fichier ''src/main/resources/META-INF/persistence.xml'' contient les informations pour mettre en place le cadre de persistance.
  
-==== Schema relationnel ==== 
  
-Le fichier ''orm-2014/initialisation-pg.sql'' du projet embryonnaire permet de mettre en place le schéma relationnel avec quelques données dans la base PostgreSQL((pour les bases postgres des salles TP: login ''etudiant'', mot de passe ''etudiant'')).+==== Base de donnée et schema relationnel ====
  
-<file sql initialisation-pg.sql>+=== Installation et démarrage de la base H2 === 
 + 
 +[[http://h2datadase.com|H2]] est une base de donnée Java qui sera utilisée dans ce TP((Le TP fonctionne aussi sous d'autres SGBD comme PostgreSQL à condition d'adapter le fichier ''persistence.xml''. Il est cependant demandé de le faire fonctionner sur H2 pour faciliter le travail de correction)). Télécharger et décompresser le fichier [[http://liris.cnrs.fr/~ecoquery/files/h2-2014-08-06.zip|h2-2014-08-06.zip]] et lancer la console H2 à l'aide du fichier ''h2.sh'' ou ''h2.bat''. Une page web s'ouvre. Utiliser la configuration ''Generic H2 (Server)''
 +<note important> 
 +Vérifier la configuration: 
 +  * Pilote JDBC: ''org.h2.Driver'' 
 +  * URL JDBC: ''<nowiki>jdbc:h2:tcp://localhost/~/test</nowiki>'' 
 +  * Nom d'utilisateur: ''sa'' 
 +  * Mot de passe: //vide// 
 +</note> 
 +Tester la connexion, puis se connecter. 
 + 
 +=== Mise en place du schéma === 
 + 
 +Le fichier ''orm-2014/initialisation-h2.sql'' du projet embryonnaire permet de mettre en place le schéma relationnel dans la base H2. Utiliser la console H2 dans le navigateur pour mettre en place ce schéma. 
 + 
 +<file sql initialisation-h2.sql>
 create table cinema( create table cinema(
  nom varchar(255) primary key,  nom varchar(255) primary key,
Ligne 87: Ligne 102:
  
 create table seance( create table seance(
- debut date+ debut timestamp
- fin date,+ fin timestamp,
  salle varchar(30),  salle varchar(30),
  cinema varchar(255),  cinema varchar(255),
Ligne 101: Ligne 116:
 create table reservation( create table reservation(
  id integer primary key,  id integer primary key,
- seance date,+ seance timestamp,
  salle varchar(30) ,  salle varchar(30) ,
  cinema varchar(255) ,  cinema varchar(255) ,
Ligne 108: Ligne 123:
  foreign key (cinema,salle,seance) references seance(cinema,salle,debut));  foreign key (cinema,salle,seance) references seance(cinema,salle,debut));
   
 +
 +CREATE SEQUENCE hibernate_sequence
 +INCREMENT 1
 +MINVALUE 1
 +MAXVALUE 9223372036854775807
 +START 1
 +CACHE 1;
 +
 </file> </file>
 ===== Travail demandé ===== ===== Travail demandé =====
Ligne 126: Ligne 149:
 === Divers === === 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''. Voir également ''@ElementCollection'' si les éléments de la collection ne sont pas des entités.   * 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''. Voir également ''@ElementCollection'' si les éléments de la collection ne sont pas des entités.
-  * Les annotations @Column, @JoinColumn, @JoinTable sont à utiliser dans le mapping+  * Les annotations ''@Column''''@JoinColumn''''@JoinTable'' sont à utiliser dans le mapping 
 +  * Avec le paramètre ''mappedBy'', il est possible d'utiliser une valeur du type ''maCle.unChamp'' pour indiquer que la relation inverse est référencée à partir d'un champ dans une clé composée (i.e. en présence de ''@Embbedable''/''@EmbbeddedId'').
   * 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.   * 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:   * L'ordre suivant est suggéré dans la mise en place des classes et du mapping:
     * Classes Salle, Seance, Client, Reservation sans traiter les associations     * Classes Salle, Seance, Client, Reservation sans traiter les associations
 +      * il est possible pour cela d'utiliser des type primitifs comme ''int'' ou ''String'' pour les champs qui sont des clés étrangères. Ces champ seront remplacés par des champs désignant des classes du modèle le moment venu (par exemple un champ ''String cinema'' pourra plus tard être remplacé par un champ ''Cinema cinema''
     * Association Salle <-> Cinema     * Association Salle <-> Cinema
     * Association Seance <-> Salle     * Association Seance <-> Salle
     * Associations Reservation <-> Seance et Reservation <-> Client     * Associations Reservation <-> Seance et Reservation <-> Client