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 One to Many


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 54
    Par défaut Mapping One to Many
    Bonjour à tous !

    Je me mets depuis peu à hibernate et je suis confronté à un problème qui me rend chèvre.

    Donc j'ai une classe entité commande qui doit avoir une relation oneToMany unidirectionnelle avec une autre classe entité nommée produit.

    Voici le code de la jointure dans la classe commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    List<Produit> produits = new ArrayList<Produit>();
    	@OneToMany(cascade={CascadeType.ALL})
    	@JoinTable(
    			name="produitsCommande",
    			joinColumns=@JoinColumn(name="produit_id",unique=false),
    			inverseJoinColumns=@JoinColumn(name="idCommande",unique=false)
    	)
    	public List<Produit> getProduits() { return this.produits; }
    	public void setProduits(List<Produit> prods) { this.produits = prods; }
    Je n'ai pas d'erreur d'execution lorsque je compile et execute les créations de tables (j'utilise Maven).
    Seulement lorsque je lance des tests unitaires en créant deux produits, et que je lance mon test unitaire de création de commande avec comme liste de produits les 2 produits créés précédemment, je me retrouve avec une table de jointure comme ceci :
    +------------+------------+
    | produit_id | idCommande |
    +------------+------------+
    | 1 | 1 |
    | 1 | 2 |
    +------------+------------+

    Ce qui n'est absolument pas logique, l'inverse devrait être fait, avec deux idCommande à 1 (l'id en lui même) et les produit_id devraient être à 1 et 2.
    Si je me débrouille pour paramétrer l'inverse, alors la contrainte d'unicité sur idCommande m'empêche d'enregistrer la commande avec une erreur du style "Duplicate entry '1' for key 1"...

    Ma question finalement est : comment paramétrer simplement une relation oneToManu unidirectionnelle ?

    D'avance merci.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 46
    Par défaut
    je n'ai jamais utilisé hibernate et les annotations mais une chose est sure : il ne doit pas y avoir de contrainte d'unicitté sur la colonne idCommande de ta table produitsCommande.

    si tu veux une clef primaire il faut :
    - soit qu'elle porte sur les deux colonnes
    - soit creer une 3eme colonne qui sera une clef primaire technique

    je ne sais pas si cela vaut vraiment le coup de mettre ce genre de contrainte sur cette table

  3. #3
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 54
    Par défaut
    Merci pour ta réponse,

    C'est à dire que justement je ne sais pas contrôler avec hibernate la création des clé primaires dans ce cas, hibernate la génère automatiquement...
    En fait j'ai déjà pensé à ajouter une 3ème colonne qui aurait la fonction d'être la clé primaire mais je n'ai trouvé aucune docs sur le sujet...

  4. #4
    Membre Expert
    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
    Par défaut
    N'aurais tu pas plutôt besoin d'une relation many-to-many, puisque tu utilises une table de jointure ?

  5. #5
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 54
    Par défaut
    Citation Envoyé par fr1man Voir le message
    N'aurais tu pas plutôt besoin d'une relation many-to-many, puisque tu utilises une table de jointure ?
    Non je ne pense pas vu qu'un produit présent dans la table produit ne doit pas avoir de référence avec une commande.
    La commande ne fait que piocher dans des produits disponibles et référencés...
    Donc relation oneToMany unidirectionnelle.

    A la limite je pourrais faire appel à une collection d'éléments (@CollectionOfElements) mais je tombe sur le même problème que ci-dessus...

  6. #6
    Membre Expert
    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
    Par défaut
    C'est pourtant bien ce que tu essaies d'implementer.
    Une commande contient n produits.
    Un produit peut appartenir a n commandes.
    Donc relation many-to-many unidirectionnelle et le tour est joué.
    A moins que tu aies besoin d'autres informations dans cette table de jointure.

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

Discussions similaires

  1. Insertion de données avec un mapping one-to-many
    Par mj_51 dans le forum Hibernate
    Réponses: 2
    Dernier message: 26/06/2014, 13h39
  2. [Mapping] Erreur lors du mapping one-to-many
    Par nifertari18 dans le forum Hibernate
    Réponses: 2
    Dernier message: 21/05/2013, 21h15
  3. Mapping one-to-many - saveOrUpdate
    Par -=mateo=- dans le forum Hibernate
    Réponses: 4
    Dernier message: 15/07/2010, 17h36
  4. Réponses: 2
    Dernier message: 17/07/2006, 14h45
  5. [Hibernate] Mapping one-to-many + cle composite
    Par brainstorm dans le forum Hibernate
    Réponses: 2
    Dernier message: 23/06/2006, 10h51

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