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 :

Lien entre 2 objets et insert


Sujet :

Hibernate Java

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Lien entre 2 objets et insert
    J'ai deux objets equipe et stade, avec chacun un lien vers l'autre.

    Pour mon mapping, je fais :

    Côté équipe :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <many-to-one name="stade"
                        column="stadeId"
                        not-null="true"
                        unique="true"
                        cascade="all"
                 />

    Côté stade :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <many-to-one name="equipe"
                        column="equipeId"
                        not-null="false"
                        unique="true"
                 />

    Puis, voici mon code (un peu nettoyé pour plus de lisibilité) :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    uneEquipe.setStade(unStade);
    unStade.setEquipe(uneEquipe);
     
    hibernate.sauver(uneEquipe);

    Je n'arrive pas à sauvegarder/insérer mes objets en base... hibernate me dit que quand il veut sauver en base le stade, l'objet equipe est transient. Normal, vu qu'il n'est pas encore en base, et qu'il le sera une fois le stade sauvegardé. C'est donc un cercle vicieux.

    Comment faire ? Car je ne sais pas si faire cela est mieux (en déclarant dans le mapping que equipe peut être null pour un stade) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    uneEquipe.setStade(unStade);
    unStade.setEquipe(null);
     
    hibernate.sauver(uneEquipe);
    unStade.setEquipe(uneEquipe);
    hibernate.sauver (unStade);
    Je doute que ce soit très optimisé et je n'ose imaginer ce qu'il faut faire pour sauver de la même manière des listes d'objets (toujours avec une relation dans les deux sens) !

    Que me conseillez vous ?

    Merci d'avance,
    speechmill

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    uneEquipe.setStade(unStade);
    unStade.setEquipe(uneEquipe);
     
    // Commencer une transaction
    session.save(uneEquipe);
    session.save(unStade);
    // Commiter la transaction

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci de cette réponse rapide. J'essaye dès que possible.

    EDIT : hélàs :

    org.hibernate.PropertyValueException: not-null property references a null or transient value: Stade.equipe

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par speechmill Voir le message
    Que me conseillez vous ?

    Merci d'avance,
    speechmill
    si ce que vous voulez exprimer est "une équipe peut jouer dans plusieurs stades et un stade peut acceuillir plusieurs équipes",
    il faut une relation many-to-many et donc une table intermédiaire...

    sinon

    l'inverse d'une many-to-one est une one-to-many et vous devez modifier l'une des 2 relations, et en toute logique ce serait le stade qui peut acceuillir plusieurs équipes, une équipe ayant un seul stade…

  5. #5
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    En fait, c'est : une équipe possède un stade, un stade possède une équipe (après pour savoir qui joue où, il y a les matchs, mais c'est une autre histoire ).

    J'ai découpé en deux pour envisager le cas où on a un stade mais on ne connait pas son équipe (d'où le not-null="false" du côté de la classe Stade).

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par speechmill Voir le message
    En fait, c'est : une équipe possède un stade, un stade possède une équipe (après pour savoir qui joue où, il y a les matchs, mais c'est une autre histoire ).

    J'ai découpé en deux pour envisager le cas où on a un stade mais on ne connait pas son équipe (d'où le not-null="false" du côté de la classe Stade).
    alors c'est du one-to-one pas du many-to-one...
    mais remarquez alors que vous ne pourrez pas exprimer qu'un stade acceuille plusieurs équipes... (imaginez les différentes équipes d'âge - poussins, minimes, etc - d'un club par exemple...)

  7. #7
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 171
    Points : 97
    Points
    97
    Par défaut
    Comme disait the-gtm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    uneEquipe.setStade(unStade);
    unStade.setEquipe(uneEquipe);
     
    // Commencer une transaction
    session.save(uneEquipe);
    session.save(unStade);
    // Commiter la transaction
    soit, tu fait les 2 inserts dans la meme transaction soit tu ne fait qu'un seule insert en ajoutant ceci a ton mapping insert="true"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <many-to-one name="stade"
    column="stadeId"
    not-null="true"
    unique="true"
    cascade="all"
    insert="true"
    />

  8. #8
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    alors c'est du one-to-one pas du many-to-one...
    mais remarquez alors que vous ne pourrez pas exprimer qu'un stade acceuille plusieurs équipes... (imaginez les différentes équipes d'âge - poussins, minimes, etc - d'un club par exemple...)
    J'en suis conscient. Mais les données que je récupère sont ainsi... (voir le jeu de football hattrick.org).

    Je vais quand même regarder ce one-to-one qui semble plus approprié, mais j'avais lu qu'avec "unique=true" c'était la solution.

  9. #9
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par metalpetsFR Voir le message
    Comme disait the-gtm


    soit, tu fait les 2 inserts dans la meme transaction soit tu ne fait qu'un seule insert en ajoutant ceci a ton mapping insert="true"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <many-to-one name="stade"
    column="stadeId"
    not-null="true"
    unique="true"
    cascade="all"
    insert="true"
    />
    merci de ta réponse, par contre faire les 2 inserts dans la même transaction ne fonctionne pas chez moi . Je teste ce soir.

  10. #10
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bon hé bien, c'est tjs la même chose...merci de votre aide en tout cas.

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par speechmill Voir le message
    Bon hé bien, c'est tjs la même chose...merci de votre aide en tout cas.
    faites un mapping many-to-many et le problème se résolvera tout seul…

    même si en pratique vous n'aurez qu'un record intersection par stade c'est la seule solution pour qu'Hibernate en déduise le code correct…

  12. #12
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Direction la doc pour une relation 1-1 bidirectionnelle :
    http://www.hibernate.org/hib_docs/v3...irectional-121

    Niveau code, the-gtm t'a donné la solution.

Discussions similaires

  1. [VB.NET] Faire le lien entre les objets et la base de donnée
    Par -Fly- dans le forum Débuter
    Réponses: 2
    Dernier message: 17/05/2012, 18h23
  2. lien entres deux objets
    Par surfing903 dans le forum Langage
    Réponses: 17
    Dernier message: 15/08/2007, 18h55
  3. Lien entre 2 tables et insertion du résultat
    Par kryss_63 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 12/07/2007, 17h31
  4. Liens entre objets ADO et ADOX ?
    Par LyriS dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 12/04/2006, 19h31
  5. [DAO] Faire le lien entre les VO et les Objets Métiers
    Par mauvais_karma dans le forum Hibernate
    Réponses: 12
    Dernier message: 25/11/2005, 15h19

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