IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

[Hibernate] mapping d'une collection


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 39
    Par défaut [Hibernate] mapping d'une collection
    Bonjour à tous,

    J'ai trouvé beaucoup d'informations au sujet du mapping d'une collection mais je n'arrive pas à la faire fonctionner car je ne comprends pas tout.

    Admettons que je voudrais mapper des objets représentant des chats. Ces chats ont donc des attributs simples que j'arrive à mapper (un nom, un id, un sexe...)

    Donc à cette étape ca fonctionne. Chaque attribut est représenté par une colonne dans la table correspondante.

    Par contre, ca se corse quand je veux rajouter une liste ou un ensemble d'amis à un chat. Comment faire pour mapper cette liste ???

    Voici mes fichiers :

    Cat.hbm.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
     <class name="org.hibernate.examples.testAFC.Cat" table="cat">
      <!-- A 32 hex character is our surrogate key. It's automatically
                generated by Hibernate with the UUID pattern. -->
      <id name="id" type="string">
       <column name="cat_id" not-null="true" sql-type="char(32)"/>
       <generator class="uuid.hex"/>
      </id>
      <!-- A cat has to have a name, but it shouldn' be too long. -->
      <property lazy="false" name="name">
       <column length="16" name="name" not-null="true"/>
      </property>
      <property lazy="false" name="sex"/>
      <property lazy="false" name="weight"/>
      <set name="friends" sort="unsorted">
    	<key column="friend_id"/>
       	<one-to-many class="org.hibernate.examples.testAFC.Cat"/>
      </set>
     </class>
    </hibernate-mapping>
    hibernate.cfg.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     
    <hibernate-configuration>
     
        <session-factory>
     
            <property name="connection.datasource">java:comp/env/jdbc/testAFC</property>
            <property name="show_sql">false</property>
            <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
     
            <!-- Mapping files -->
            <mapping resource="Cat.hbm.xml"/>
     
        </session-factory>
     
    </hibernate-configuration>
    Cat.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    package org.hibernate.examples.testAFC;
     
    import java.util.HashSet;
    import java.util.Set;
     
    import org.hibernate.Session;
    import org.hibernate.Transaction;
     
    public class Cat {
     
        private String id;
        private String name;
        private char sex;
        private float weight;
        private Set friends;
     
        public Cat() {
        	friends = new HashSet();
        }
     
        public Set getFriends() {
        	return friends;
        }
     
        public void setFriends(HashSet set) {
        	friends = set;
        }
     
        public String getId() {
            return id;
        }
     
        private void setId(String id) {
            this.id = id;
        }
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
     
        public char getSex() {
        	Session session = HibernateUtil.currentSession();
        	Transaction tx = session.beginTransaction();
     
        	this.setName("Princess");
        	this.setSex('F');
        	this.setWeight(7.4f);
     
        	for (int i=0;i<5;i++) {
        		Cat cat = new Cat();
        		cat.setName("cat"+Integer.toString(i));
        		cat.setSex('F');
        		cat.setWeight(7.6f);
                                    session.save(cat);
        	}
     
        	session.save(this);
     
        	tx.commit();
        	HibernateUtil.closeSession();
     
            return sex;
        }
     
        public void setSex(char sex) {
            this.sex = sex;
        }
     
        public float getWeight() {
            return weight;
        }
     
        public void setWeight(float weight) {
            this.weight = weight;
        }
    }
    Alors je fais le mapping dans la méthode getSex() car il s'agit d'un bean utilisé dans une page JSF et qui appelle cette méthode...

    Ce que je ne comprends pas, c'est quelle colonne je dois rajouter dans ma table pour stocker ma liste ? Et donc quel est le lien avec ce passage de mon fichier Cat.hbm.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <set name="friends" sort="unsorted">
    	<key column="friend_id"/>
       	<one-to-many class="org.hibernate.examples.testAFC.Cat"/>
      </set>

    Merci d'avance
    @+
    Jorus

  2. #2
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Il te faut une table de croisement pour modéliser 2 relations 1-n : un chat peut avoir plusieurs amis (relation 1) et il peut faire partie des amis de plusieurs chats (relation 2).

    Table chat :
    cat_id
    name
    sex
    weight

    Table de croisement :
    id_cat1
    id_cat2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <set name="friends" sort="unsorted" table="..." lazy="true" cascade="save-update">
        <key column="cat_id1"/>
        <many-to-many class="....Cat" column="cat_id2"/>
    </set>
    Je n'ai pas testé mais théoriquement, ca doit marcher.

  3. #3
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 39
    Par défaut
    super merci, je teste ca !

    ++
    Jorus

  4. #4
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 39
    Par défaut
    Ca fonctionne au poil !!!

    Un grand merci car j'avais un peu de mal à me dépatouiller de la doc d'hibernate. Ca me semble plus clair maintenant.

    Juste une dernière question avant de cliquer sur résolu :

    Si j'avais eu une classe CatMaster représentant les maitres d'un chat, j'aurais simplement utilisé une association <one-to-many> dans le mapping de ma classe CatMaster et une association <one-to-one> dans le mapping de ma classe Cat, c'est bien çà ?

    Merci
    @+
    Jorus

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    J'ai essayé le code que l'on ta fournit mais moi cela me crée une erreur, je suis aussi débutante et j'ai changé many to many par one to many...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <set name="child" sort="unsorted" table="..." lazy="true" cascade="save-update"> 
        <key column="cat_id1"/> 
        <one-to-many class="....Cat" column="cat_id2"/> 
    </set>
    Car moi je veux une liste des chat qui sont enfants de mon chat, et je veux mémoriser le chat qui est mon parent, cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <many-to-one class="cmatinier.core.element.Person" name="parent" column="parent_uid">
    </many-to-one>
     
    <set name="children" sort="unsorted" table = "PERSON" lazy="true" cascade="save-update">
    	<key column="child_uid"/>
    	<one-to-many class="cmatinier.core.element.Person" column="child"/>
    </set>
    est ce que c'est bon ?
    [/code]

  6. #6
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <many-to-one name="parent"
        column="parent_uid"
        not-null="true"
        update="false"/>
     
    <set name="children"
        inverse="true">
        <key column="parent_uid"/>
        <one-to-many class="Person"/>
    </set>

  7. #7
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Citation Envoyé par Jorus
    Si j'avais eu une classe CatMaster représentant les maitres d'un chat, j'aurais simplement utilisé une association <one-to-many> dans le mapping de ma classe CatMaster et une association <one-to-one> dans le mapping de ma classe Cat, c'est bien çà ?
    Si tu fais ce que tu dis (en tout cas ce que je crois comprendre), tu vas modéliser une relation 1-1 et donc le maitre n'aura qu'un chat et le chat n'aura q'un maitre. Est ce vraiment ce que tu souhaites ? Un maitre ne peut il pas avoir plusieurs chats ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    Citation Envoyé par dlemoing
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <many-to-one name="parent"
        column="parent_uid"
        not-null="true"
        update="false"/>
     
    <set name="children"
        inverse="true">
        <key column="parent_uid"/>
        <one-to-many class="Person"/>
    </set>
    Je n'ai pas compris tu relis les enfants au parents ?
    on s'est peut etre mal compris (ou alors g rien compris à ce que tu as fais).
    dans ma classe Chat je veux :
    Cat Parent;
    List ChildCat;

    La list de ChildCat contiendra une liste de Cat,
    Rq : ma liste n'est pas type car j'utilise java 1.4

  9. #9
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Citation Envoyé par lilou77
    Je n'ai pas compris tu relis les enfants au parents ?
    C'est si étrange que ca ? Moi je trouve ca très naturel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <many-to-one name="parent"
        column="parent_uid"
        not-null="true"
        update="false"/>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <set name="children"
        inverse="true">
        <key column="parent_uid"/>
        <one-to-many class="Cat"/>
    </set>

  10. #10
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Regarde dans la doc d'hibernate. Il y a exactement l'exemple que tu décris et tu verras que la solution que je donne est celle proposée.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    et donc avec ca, mon chat fera bien la différence entre ses enfant à lui et son parent ?
    (on est d'accord que les enfant sont les enfants de mon chat et pas du parent?, pour mon parent c'est ses petits enfants, car mon chat etant son enfants...)

  12. #12
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Citation Envoyé par lilou77
    et donc avec ca, mon chat fera bien la différence entre ses enfant à lui et son parent ?
    (on est d'accord que les enfant sont les enfants de mon chat et pas du parent?, pour mon parent c'est ses petits enfants, car mon chat etant son enfants...)
    Oui. Ton chat avant d'être parent à été enfant d'un autre chat. Le mapping que je donne gère ce cas.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    désolé d'avoir insisté...
    merci pour l'aide...

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    derniere question pour la collection set tu ne précise pas la table ?
    car c'est celle où on est ?

  15. #15
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Exactement.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    merci encore, ...

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    Une simple question si je supprime mon chat je veux que ses enfants soit supprimé...
    donc
    il faut genre que je rajoute dans le mapping xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    key on-delete="cascade"
    ?

  18. #18
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Citation Envoyé par Confucius
    J'entends et j'oublie,
    Je vois et je me souviens,
    Je fais et je comprends
    J'explique et je maitrise.

  19. #19
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    Citation Envoyé par lilou77
    Une simple question si je supprime mon chat je veux que ses enfants soit supprimé...
    donc
    il faut genre que je rajoute dans le mapping xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    key on-delete="cascade"
    ?
    Essaies le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <set name="children" 
        inverse="true" cascade="delete-orphan"> 
        <key column="parent_uid"/> 
        <one-to-many class="Cat"/> 
    </set>

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    merci je ne trouve rien dans les doc, moi j'avai mis cascade="delete"

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Mapping] Problème mapping avec une collection Map
    Par hpnet dans le forum Hibernate
    Réponses: 2
    Dernier message: 16/07/2012, 11h25
  2. Erreur dans le mapping d'une collection
    Par gégé140488 dans le forum JPA
    Réponses: 1
    Dernier message: 06/10/2011, 16h21
  3. Hibernate Mapping sur une même table
    Par bubule22 dans le forum Hibernate
    Réponses: 2
    Dernier message: 26/09/2008, 17h24
  4. [Debutant]Mapping pour une collection
    Par maxattack dans le forum Hibernate
    Réponses: 14
    Dernier message: 14/06/2007, 10h59
  5. Erreur MySQL suite au mapping d'une collection
    Par K-Kaï dans le forum Hibernate
    Réponses: 8
    Dernier message: 08/06/2007, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo