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:2013 [2013/09/22 15:26]
ecoquery [Schema relationnel]
enseignement:tp:bd:tp-orm:2013 [2013/10/09 05:27] (Version actuelle)
ecoquery [Mise en oeuvre de mappings Objet/Relationnels]
Ligne 1: Ligne 1:
 ====== Mise en oeuvre de mappings Objet/Relationnels ====== ====== Mise en oeuvre de mappings Objet/Relationnels ======
-** Sujet en cours d'élaboration **+ 
 +=== Rendu === 
 + 
 +Ce TP est à rendre pour le dimanche <del>06/10/2013</del> 13/10/2013.  
 + 
 +On déposera une archive zip sur spiral: 
 +  le nom du fichier sera de la forme ''//Grp//-//Nom1//-//Numero1//-//Nom2//-//Numero2//.zip'' où: 
 +    Grp est le groupe de TD: A, B ou C 
 +    * Nom1 est le nom du premier étudiant du binôme, Nom2 celui du deuxième étudiant. 
 +    * Numero1 est le numéro d'étudiant du premier étudiant du binôme, Numéro2 celui du deuxième. 
 +    Il est possible de rendre une archive ''.zip'', ''.tar.gz'' ou ''.7z''**Aucun autre format ne sera accepté**. 
 +  * L'archive contiendra 
 +    * Le projet fourni mis à jour par vos soins pour répondre au travail demandé. 
 +    * Un fichier ''etudiants.properties'' dont le contenu sera une mise à jour du suivant: <file properties etudiants.properties>groupe=X 
 +nom1=aaaaaa 
 +prenom1=bbbbbb 
 +numero1=1234567 
 +nom2=cccccc 
 +prenom2=dddddd 
 +numero2=2345678</file> 
 +  * Il est demandé (avant de faire l'archive) de: 
 +    * supprimer le répertoire target 
 +    * supprimer les .class et autres .jar qui restent 
 +    * effectuer un commit mercurial local (qui pourra servir en cas de litige sur e.g. la date de rendu) 
 +  * L'archive est à déposer avant la date limite (dimanche 13/10/2013) sur spiral ici: http://spiralconnect.univ-lyon1.fr/webapp/activities/activities.jsp?containerId=2619670 
 +  * Il est fortement recommandé de tester que l'accès fonctionne avant le weekend afin de ne pas être coincé pour le rendu 
 +    * La zone de dépôt spiral sera fermée automatiquement une fois la date limite dépassée 
 + 
 +=== Evaluation === 
 + 
 +Le TP sera évalué sur le fonctionnement du mapping et sur la cohérence du modèle objet, mais surtout sur les commentaires qui viendront expliciter ces éléments. En particulier chaque occurrence de chaque annotation devra être commentée afin d'indiquer sa signification. 
 + 
 +Le non respect des consignes de rendu entrainera une sanction sur la note du TP. 
 + 
 +=== Remarques diverses === 
 + 
 + 
 +<note warning>Sur les machines des salles  TP, faire le TP sous Windows (les IDE sont mal installées sous linux)</note> 
 +<note warning>Il faut ajouter la propriété suivante au fichier ''persistence.xml'' 
 +<code xml> 
 +<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> 
 +</code> 
 +</note> 
 + 
 +<note tip>Une erreur du type <code>INFO: HHH000262: Table not found: Vin</code> indique que vous n'avez pas créé les tables dans la base postgresql à l'aide du script fourni.</note>
 ===== Introduction ===== ===== Introduction =====
  
Ligne 12: Ligne 56:
   * {{:enseignement:bdav:mapping-objets-relationnel-xml.pdf|Transparents du cours ORM}}   * {{:enseignement:bdav:mapping-objets-relationnel-xml.pdf|Transparents du cours ORM}}
   * [[enseignement:tp:bd:tp-orm|Un ancien TP sur les ORM]]   * [[enseignement:tp:bd:tp-orm|Un ancien TP sur les ORM]]
- 
-===== 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 ===== ===== Projet embryonnaire =====
Ligne 22: Ligne 62:
 Configurer Maven comme indiqué [[enseignement:aide:logiciels#maven|dans l'aide]]. Configurer Maven comme indiqué [[enseignement:aide:logiciels#maven|dans l'aide]].
  
-Télécharger et décompresser le projet de base: {{:enseignement:tp:bd:tp-orm:mif18-tp-orm-base.zip|bdav-tp-orm-base.zip}}.+Télécharger et décompresser le projet de base: {{:enseignement:tp:bd:tp-orm:mif18-2013-base.zip|}}, ou mieux le cloner depuis la forge: 
 +<code shell> 
 +hg clone https://forge.univ-lyon1.fr/hg/inf1008m-2013-base mif18-2013-base 
 +</code>
  
 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. Dans Eclipse, il faut importer le projet en utilisant ''Import existing maven project''. Le projet peut être directement ou vert dans Netbeans.
 +
 +<note warning>Le projet à utiliser est le projet orm-2013, disponible soit directement, soit le cas échéant dans les modules du projet ouvert</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.
  
-Le fichier ''src/main/resources/META-INF/persistence.xml'' contient les informations pour mettre en place le cadre de persistence.+Le fichier ''src/main/resources/META-INF/persistence.xml'' contient les informations pour mettre en place le cadre de persistance.
  
-<note tip>Si vous utilisez Oracle, ces deux fichiers sont à modifier en suivant les commentaires qui sont dedans.</note>+==== 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 dans la base PostgreSQL((pour les bases postgres des salles TP: login ''etudiant'', mot de passe ''etudiant'')).
  
 ===== Travail demandé ===== ===== Travail demandé =====
Ligne 38: Ligne 85:
   - Concevoir un modèle objet correspondant au modèle relationnel fourni et créer des classes Java correspondantes.   - Concevoir un modèle objet correspondant au modèle relationnel fourni et créer des classes Java correspondantes.
   - 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.    - 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. 
 +    * Un début de classe Vin annoté peut servir de point de départ.
 +    * Faire une énumération pour les couleurs de vin: rouge, rose, blanc.((c.f. ''@Enumerated'' pour le mapping))
 +    * Dans la mesure du possible, les associations devront être bidirectionnelles
 +      * Dans le cas d'associations bidirectionnelles, la cohérence des informations en mémoire devra être garantie.
  
 ==== Remarques additionnelles ==== ==== Remarques additionnelles ====
Ligne 43: Ligne 94:
 === Tester le mapping === === Tester le mapping ===
  
-Le mapping relationnel objet peut être tester à travers le [[:enseignement:aide:apis#junit|TestCase JUnit]] placé dans ''src/test/java/bdav/orm/MappingTest.java''.+Le mapping relationnel objet peut être tester à travers le [[:enseignement:aide:apis#junit|TestCase JUnit]] placé dans ''src/test/java/mif18/orm/MappingTest.java''.
 Cette classe est exécutable directement comme test JUnit dans Eclipse ou Netbeans. Cette classe est exécutable directement comme test JUnit dans Eclipse ou Netbeans.
  
 === 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''.+  * 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
   * 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:
-    * Classe Film sans association. On pourra utiliser/s'inspirer du code suivant:<code java> +    * Enum Couleur, à utiliser dans vin 
- +    * Classes Appellation, Producteur, Region sans traiter les associations 
-@Entity(name = "film"+    * Association Appellation <-> Region 
-public class Film implements Serializable { +    * Associations Vin <-> Appellation, Producteur 
- private static final long serialVersionUID = 1L; +    * Traitement de la composition des vins
- +
- @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; +
-+
-+
-</code> +
-    * 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+