-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 
Author Message
 Post subject: Mapper une classe qui hérite d'une classe qu'elle contient
PostPosted: Wed Nov 16, 2005 11:43 am 
Beginner
Beginner

Joined: Mon Aug 08, 2005 7:54 am
Posts: 27
Bonjour,

Je suis encore relativement débutant à Hibernate et j'ai du mal à mapper un concept que j'ai mis en place dans mon design. Je suis sûr que celui ci est possible avec la capacité d'hibernate, mais je n'arrive pas à rédiger le fichier xml car je connais encore très mal le langage XML de hibernate et que j'ai encore qql difficultés avec les concepts élaborés de l'ORM.

Voilà le problèmes en deux dessin ( UML et Merise) :

Coté objet, voilà l'idée :

Image

En deux mot, ItemList est lui aussi un Item mais en plus il contient une liste d'autre Item. Niveau objet, rien de très élaboré.

Coté DB je verrais bien le modèle suivant :

Image

La propriété LIST est fixé à TRUE si l'ITEM en contient d'autre. Cette propriété n'est pas une obligation mais je pense qu'elle simplifie le problème ( au moins sur feuille).

Voilà mon essai de fichier Mapping :

Code:
  <class name="Item" table="ITEM">
                <id name="id" column="ID">
                        <generator class="increment"/>
                </id>
                <discriminator column="LINE_ID" insert="false"/>
                <property name="Property" column="PROPERTY"/>
        </class>

        <subclass name="ItemList" extends="Item" discriminator-value="L">                       
                        <list name="items" table="ITEMS">
                        <key column="ID_LIST" not-null="true" update="false"/>
                        <list-index column="ID_ITEM"/>
                        <many-to-many unique="true" column="ID_ITEM" class="Item"/>                                 
                </list>       
        </subclass>


Le problème sur lequel je travaille est plus riche que ce simple example, donc il est possible que le fichier de mapping ci dessous fonctionne bien pour un cas aussi élémentaire. J'aimerais surtout savoir si je m'y prend de la bonne façon ( surtout n'hésite pas à me commenter l'usage des différents mot clés du xml d'hibernate merci !)...

_________________
Belaran,
"Slowly climbing the moutain of Hibernate's mystery..."


Top
 Profile  
 
 Post subject:
PostPosted: Wed Nov 16, 2005 12:32 pm 
Beginner
Beginner

Joined: Mon Aug 08, 2005 7:54 am
Posts: 27
Il y a une petite erreur dans le fichier ci dessus, le fichier ci dessous la corrige ;



Code:
  <class name="Item" table="ITEM">
                <id name="id" column="ID">
                        <generator class="increment"/>
                </id>
                <discriminator column="ID_ITEM" insert="false"/>
                <property name="Property" column="PROPERTY"/>
        </class>

        <subclass name="ItemList" extends="Item" discriminator-value="L">                       
                        <list name="items" table="ITEMS">
                        <key column="ID_LIST" not-null="true" update="false"/>
                        <list-index column="ID_ITEM"/>
                        <many-to-many unique="true" column="ID_ITEM" class="Item"/>                                 
                </list>       
        </subclass>


J'ai testé ce mapping et j'obtiens l'erreur suivante :

Quote:
Failed : org.hibernate.MappingException: Repeated column in mapping for collection: ItemList.items column: ID_ITEM
[TestORM] - "Label: SimpleTest"

_________________
Belaran,
"Slowly climbing the moutain of Hibernate's mystery..."


Top
 Profile  
 
 Post subject:
PostPosted: Thu Nov 17, 2005 12:43 pm 
Beginner
Beginner

Joined: Mon Aug 08, 2005 7:54 am
Posts: 27
J'ai décidé de modifier mon modèle de données ainsi et remplacé l'usage d'une List par un Set pour simplifier mon problème mais aussi me rapprocher des exemples existants de Hibernate. Désormais mon modèle de données est celui ci :

Image

Avec dans la base le modèle physique suivant :

Image

Le mapping est donc :
Code:
<class name="Item" table="ITEM">
                <id name="id" column="ID">
                        <generator class="increment"/>
                </id>               
                <property name="Property" column="PROPERTY"/>
                <many-to-one name="Item"
                        column="PARENT_ID"
                        />
               
                <set  name="items" inverse="true">
                        <key column="PARENT_ID"/>
                        <one-to-many class="Item"/>
              </set>
  </class>


Désormais , tout ce passe bien et quand j'execute le code suivant, aucune erreur ne remonte :
Code:
           // creating simple transient item
           Item items = new Item("Property of the Parent");
           items.getItems().add(new Item('Property of the son");

       this.session = HibernateUtil.currentSession();
       Transaction tx = session.beginTransaction();
       session.persist(items);
       tx.commit();      
      HibernateUtil.closeSession();


Néanmoins, seul le "parent" de mon arbre se retrouve sauvegardé ! ! !

Je n'ai aucune erreur et mon mapping ressemble comme deux gouttes à celui de l'exemple CavitEmpteor.hibernate.org...

_________________
Belaran,
"Slowly climbing the moutain of Hibernate's mystery..."


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 18, 2005 7:41 am 
Beginner
Beginner

Joined: Mon Aug 08, 2005 7:54 am
Posts: 27
J'ai résolu mon problème :

En récupérant la dernier version de caveatemptor, j'ai découvert que le fichier de mapping sur lequel je me basé pour réaliser celui ci dessus était très différent en Hibernate3 !

Je me suis contenté de rajouter les éléments manquant et désormais tout fonctionne bien !

Voilà le mapping finale :
Code:
<class name="Item" table="ITEM">
                <id name="id" column="ID">
                        <generator class="increment"/>
                </id>               
                <property name="Property" column="PROPERTY"/>
                <many-to-one
                                    name="Item"
                                    class="Item"
                                    access="property"
                                    cascade="save-update, persist,merge"
                                    foreign-key="FK1_PARENT_ID">
                 <column name="PARENT_ID" not-null="false" unique-key="UNIQUE_NAME_AT_LEVEL"/>
               </many-to-one>
                <set    name="Itemss"
                        access="property"
                        cascade="all"
                        inverse="true">
                        <key column="PARENT_ID"/>
                        <one-to-many class="Item"/>
                </set>
  </class>

_________________
Belaran,
"Slowly climbing the moutain of Hibernate's mystery..."


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.