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 :

Mapping collection <set>


Sujet :

Hibernate Java

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Mapping collection <set>
    Bonjour a tous,

    J'ai 2 classes et 3 tables MySQL dont ci-joint la description SQL et le mapping hibernate ci-dessous...
    Pour information, la relation entre la table FACTURE et FACTURE_ARTICLE s'effectue par le biais du champ 'S_NODE' car il peut y avoir plusieurs factures comportant les memes articles !

    Lorsque j'effectue une requete pour obtenir la liste des factures, je n'arrive pas (apres appel a la fonction getArticles() ;-))) a recuperer la liste des articles d'une facture.
    Aucune erreur mais la collection retournee est vide ;-(((((

    Une idee ????

    ========================== SQL ======================
    CREATE TABLE SEQUENCE (
    S_NODE INT UNSIGNED NOT NULL
    ) TYPE=InnoDB;
    INSERT INTO SEQUENCE (S_NODE) VALUES (1);

    CREATE TABLE FACTURE (
    F_NODE INT UNSIGNED NOT NULL AUTO_INCREMENT,
    S_NODE INT UNSIGNED NOT NULL,
    F_ORDER INT UNSIGNED NOT NULL,
    PRIMARY KEY(F_NODE,S_NODE)
    ) TYPE=InnoDB AUTO_INCREMENT=1;
    CREATE INDEX F_S ON FACTURE (S_NODE ASC);

    CREATE TABLE FACTURE_ARTICLE (
    S_NODE INT UNSIGNED NOT NULL,
    FA_EXPORT INT UNSIGNED NOT NULL,
    PRIMARY KEY(S_NODE),
    FOREIGN KEY (S_NODE) REFERENCES FACTURE(S_NODE) ON DELETE CASCADE
    ) TYPE=InnoDB;
    ========================== SQL ======================

    ======================== MAPPING ====================
    <hibernate-mapping>
    <class name="Facture" table="FACTURE">
    <id name="node" type="integer">
    <column name="F_NODE"/>
    <generator class="native"/>
    </id>

    <property name="sequence" type="integer">
    <column name="S_NODE" not-null="true"/>
    </property>

    <property name="order" type="int">
    <column name="F_ORDER" not-null="true"/>
    </property>

    <set name="articles" table="FACTURE_ARTICLE">
    <key>
    <column name="S_NODE" not-null="true"/>
    </key>
    <one-to-many class="ItemFA"/>
    </set>
    </class>
    </hibernate-mapping>

    ###############################################

    <hibernate-mapping>
    <class name="ItemFA" table="FACTURE_ARTICLE">
    <id name="sequence" type="integer">
    <column name="S_NODE"/>
    </id>

    <property name="export" type="int">
    <column name="FA_EXPORT" not-null="true"/>
    </property>

    <many-to-one name="facture" class="Facture" insert="false" update="false">
    <column name="S_NODE" not-null="true"/>
    </many-to-one>
    </class>
    </hibernate-mapping>
    ======================== MAPPING ====================

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 64
    Points : 59
    Points
    59
    Par défaut
    Au lieu d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <class name="Facture" table="FACTURE">
    ajoute lazy="false" et ça devrait résoudre ton problème, ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <class name="Facture" table="FACTURE" lazy="false">
    Tu le mets dans chaque mapping et c'est bon.
    Par contre 2 mapping pour 3 tables, bizarre....

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Ta proposition ne fonctionne pas ;-(((

    En fait, la table SEQUENCE est uniquement presente pour generer un ID qui sera stocke dans la table FACTURE et la table FACTURE_ARTICLE me permettant d'effectuer une jointure !
    Donc pas besoin d'avoir un fichier de mapping pour cette table.

    En ajoutant des traces, je m'apercois qu'il execute bien la requete pour le mapping mais aucun enregistrement n'est present en retour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Hibernate: select this_.F_NODE as F1_16_0_, this_.S_NODE as S2_16_0_, this_.F_ORDER as F3_16_0_ from FACTURE this_
    <STDOUT>
    ID:1 Sequence:25
    Hibernate: select articles0_.S_NODE as S1_1_, articles0_.S_NODE as S1_18_0_, articles0_.FA_EXPORT as FA2_18_0_ from FACTURE_ARTICLE articles0_ where articles0_.S_NODE=?
    <STDOUT>
    Une idee ???

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 64
    Points : 59
    Points
    59
    Par défaut
    Perso j'ai fait un mapping par classe, donc par table et ça fonctionne, essaie de regarder dans cette direction....

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Salut,

    Après avoir jeté un oeil à ton code, j'ai quelques remarques :

    - Je ne sais pas si ça joue, mais dans tes types, tu utilises parfois "int" et parfois "integer". Pour ma part je fais toujours "java.lang.Integer", mais je ne sais pas si c'est une obligation.
    - Il faut normalement qu'un des deux bouts de ta relation ait l'attribut inverse. Essaye de mettre dans dans ton element many-to-one l'attribut inverse="true"
    - Il me semble qu'utiliser l'attribut table permet de définir le nom d'une table intermédiaire dans une relation many-to-many. Or visiblement ici, même s'il semble que c'est ce que tu veux faire au final, tu n'as pas encore de table "ARTICLE". Essaye alors d'enlever l'attribut table de ton element <set>.
    - Sinon, le reste me semble bon. Question débile, mais toujours à vérifier : la facture que tu récupère de ta db a bien des articles associés dans ta base de donnée?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Ca aussi me semble bizarre :

    <set name="articles" table="FACTURE_ARTICLE">
    <key>
    <column name="S_NODE" not-null="true"/>

    Vu que tu es dans le sens to-many, il est impossible que tes clés étrangères soient null (ça reviendrait à demander, pour une facture donnée, la liste des articles sans factures). Pour moi l'attribut not-null est donc superflus, tu peux l'enlever.

Discussions similaires

  1. [NHibernate] mapping collection avec plusieurs cles
    Par drbarton dans le forum NHibernate
    Réponses: 0
    Dernier message: 26/08/2011, 17h04
  2. Mapping Collection et accès concurrent
    Par Royd938 dans le forum Hibernate
    Réponses: 1
    Dernier message: 22/05/2008, 11h04
  3. Réponses: 4
    Dernier message: 07/02/2008, 12h34
  4. Mapping d'un SET (Lazy)
    Par webtracker dans le forum Hibernate
    Réponses: 1
    Dernier message: 11/01/2008, 13h24
  5. Mapping collection et paramètre en plus
    Par rodbeck dans le forum Hibernate
    Réponses: 1
    Dernier message: 16/12/2007, 21h02

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