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 :

relation 1/n et valorisation de foreign key


Sujet :

Hibernate Java

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Par défaut relation 1/n et valorisation de foreign key
    J'ai mappé une relation 1/n entre une entité Commande et une entité Item de commande à savoir que fonctionnellement ma commande est composée de 1 ou plusieurs items de commande. En base cela se traduit par une clef etrangère id_commande dans la table Item_commande vers la clef primaire id_commande de la table Commande.

    Les primary_key de mes 2 tables sont valorisés via des sequences. J'ai positionné cascade="all" sur ma relation one-to-many afin de gérer la persistence des commandes et de leurs items de commande en même temps.

    Voila mon pb :
    Lorsque je créer une commande avec plusieurs items de commande associées via un appel à session.save(commande) Hibernate me valorise bien les clefs primaires de l'ensemble des objets constituant ma grappe d'objets à l'aide des séquences, il tente d'inserer la commande puis lorsqu'il tente d'inserer les lignes de commande il lève une exception précisant que id_commande est null dans mes items de commande et qu'il ne peut donc pas valoriser la clef etrangère en base.

    Ma question est : Hibernate peut-il inserer une grappe d'objets en un seul appel à la méthode save (sur mon objet parent de la grappe) et en valorisant les clefs etrangères automatiquement ?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Essaie de rajouter une relation many-to-one au niveau de tes lignes de commande. Ajoute l'attribut inverse="false" au niveau de cette relation pour préciser que la relation entre Commande et Ligne est gérée par la classe Ligne.

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Par défaut
    Citation Envoyé par the-gtm
    Essaie de rajouter une relation many-to-one au niveau de tes lignes de commande. Ajoute l'attribut inverse="false" au niveau de cette relation pour préciser que la relation entre Commande et Ligne est gérée par la classe Ligne.
    En fait ma relation est déjà bidirectionelle et si je fait ce qe tu proposes cela signifie justement qe la relation est gérée par Commande...

    Voila mon code pour vous permetter de m'aider :
    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
     
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="CommandeImpl" table="COMMANDE" lazy="false">
            <id name="idPersistent" type="integer">
                <column name="ID_COMMANDE" precision="8" scale="0" />
                <generator class="sequence">
                	<param name="sequence">seq_pro_commande</param>
                </generator>
            </id> 
            <version name="version" column="NUM_VERSION" type="long" />
            </property>          
    <set name="lignesDeCommande" inverse="true" cascade="all">
                <key column="ID_COMMANDE" not-null="true"/>
                <one-to-many class="LigneDeCommandeImpl" />
            </set>
        </class>
    </hibernate-mapping>
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="LigneDeCommandeImpl" table="LIGNE_DE_COMMANDE" lazy="false">
            <id name="idPersistent" type="integer">
                <column name="ID_LIGNE_COMMANDE" precision="8" scale="0" />
                <generator class="sequence">
                	<param name="sequence">seq_pro_lignedecommande</param>
                </generator>
            </id> 
            <version name="version" column="NUM_VERSION" type="long" />
            <many-to-one name="commande" class="CommandeImpl" column="ID_COMMANDE" not-null="true"/>
        </class>
    </hibernate-mapping>

  4. #4
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Par défaut
    Personne pour m'aider ?
    J'attends avec impatience vos conseils...

  5. #5
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Cet exemple est traité dans la doc Hibernate ...
    Il faut que dans la classe Commande tu aies une méthode addLigne qui rajoute la ligne à ton Set lignesDeCommande et qui en même temps fasse un setCommande sur la ligne.

  6. #6
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Par défaut
    Merci pour ta réponse. L'appel à la méthode addXxx doit-elle se faire obligatoirement dans le contexte d'une session hibernate ?

  7. #7
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Je ne suis pas certain d'avoir bien compris la question ... Tes objets sont liés à la Session non ?

  8. #8
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Par défaut
    Oui ils le sont au moment où je fais mon session.save(commande) pour persister la grappe d'objets mais pas au moment ou je construit la grappe d'objets, code qui se fait dans la partie cliente de l'application cad dans la partie non-transactionnelle (donc détachée d'hibernate).

  9. #9
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Ah ben aucun souci pour que cette association (le addXXX) soit fait avant que les objets soient reliés à la Session ! Pardon, j'avais zappé que c'était pour une création ...

  10. #10
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Par défaut
    Merci pour ton aide, ca marche nickel maintenant
    En effet cela etait noté dans la doc hibernate mais pas trop mis en evidence je trouve ....

  11. #11
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    J'avoue que la première fois c'est pas évident à savoir ... :p

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Foreign keys: de quelles tables partent les relations?
    Par thierry.d dans le forum Débuter
    Réponses: 1
    Dernier message: 18/08/2011, 16h46
  2. Réponses: 4
    Dernier message: 22/07/2009, 15h55
  3. Réponses: 1
    Dernier message: 18/08/2008, 17h12
  4. Réponses: 7
    Dernier message: 21/01/2007, 12h12
  5. Quelle est l'utilité des Relations & Foreign Keys?
    Par Danny Blue dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/06/2006, 12h18

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