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

JPA Java Discussion :

[EJB3] Problèmes relation @OneToMany et foreign key non renseignée


Sujet :

JPA Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut [EJB3] Problèmes relation @OneToMany et foreign key non renseignée
    Bonjour à tous,

    Je suis en train de tester les EJB3 et je recontre un problème lorsque j'essaie de persister une classe qui cotient une collection d'une autre classe (ici une classe Commande et une autre Article). Toutes les instances se persistent bien dans la base mais la foreign key des articles ne contient pas l'id de ma commande.


    Voici un extrait de mon code dans la classe Commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        @OneToMany(mappedBy = "commande",cascade=CascadeType.ALL)
        private Collection<Article> articles;
     
        public Collection<Article> getArticles() {
            return articles;
        }
     
        public void setArticles(Collection<Article> articles1) {
            this.articles = articles1;
        }
    La même chose coté Article
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        @ManyToOne
        @JoinColumn (name="cde_id")
        private Commande commande;
     
        public Commande getCommande() {
            return commande;
        }
     
       public void setCommande(Commande commande) {
            this.commande = commande;
        }
    Et la portion de code correspondant à l'execution de ma persistance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        public void createCommande(Commande commande) {
           System.out.println("EEEE"+commande.getId());
            em.persist(commande);
           System.out.println("SSSS"+commande.getId());      
        }
    Pour info, j'utilise pour mes tests : postgresql, glassfish, hibernate comme provider de persistance, netbeans 5.5

    Toute remarque est la bienvenue. Merci d'avance à ceux qui prendront le temps de me répondre.

    T.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut :-/
    Personne pour m'aiguiller un peu ?

  3. #3
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    Lors de l'ajout d'un article dans une commande, fais-tu le setxxx() dans les 2 classes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    maCommande.getArticles().add(monArticle);
    monArticle.setCommande(maCommande);
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Dans la mesure où je ne fais qu'un em.persist(commande); et qu'hibernate semble comprendre que j'ai des articles dans ma commande et qu'il me les persiste bien, j'aurais trouvé normal qu'il garde une trace de cette composition. Non ?
    Pour cela il aurait fallu qu'il update la clé privée de la table article avec l'id de ma commande.
    Seulement il ne le fait pas et c'est ce qui me surprend.

    D'autres idées?

    T.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Merci xv-mnt
    Il faut bien faire le set sur les deux objets pour que cela fonctionne correctement.
    Je trouve ça un peu dommage mais bon.

    Merci pour la réponse en tout cas.

    T.

  6. #6
    Membre actif Avatar de a.snaps
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 209
    Points : 241
    Points
    241
    Par défaut
    Citation Envoyé par TeepH
    Il faut bien faire le set sur les deux objets pour que cela fonctionne correctement.
    Je trouve ça un peu dommage mais bon.
    Il est important que tu gères un graphe d'objets sain.
    Hibernate, ni aucun autre provider de persistence, ne le fera jamais pour toi. De plus tu précises toi-même dans tes annotations que l'association est mappé par "commande" dans Article. Si tu ne le set pas...
    Si tu ne la map pas à la classe article, Hibernate créera une table "lien", tu pourrais à ce moment là en faire une relation unidirectionnelle et ne pas avoir à setter des 2 côtés.

    Maintenant je pense que le tout devrait être encapsulé dans tes classes soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public void setCommande(Commande commande) {
       if(this.commande != commande) {
          if(this.commande != null) {
             this.commande.removeArticle(this);
          }
          this.commande = commande;
          if(commande != null) {
             commande.addArticle(this);
          }
       }
    }
    et dans Commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void addArticle(Article a) {
       if(!this.articles.contains(a)) {
          this.articles.add(a);
          a.setCommande(this);
       }
    }
     
    public void removeArticle(Article a) {
       if(this.articles.contains(a)) {
          this.articles.remove(a);
          a.setCommande(null);
       }
    }

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 79
    Points : 89
    Points
    89
    Par défaut
    a.snaps :

    Interessant ton code, maintenant faudrait pouvoir automatiser cela par exemple dans netbeans dès qu'il doit générer les classes Entity Bean a partir d'une base de données et qu'il y a une relation 1-N.

    Je trouverais cela très pratique.

  8. #8
    Membre actif Avatar de a.snaps
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 209
    Points : 241
    Points
    241
    Par défaut
    Des outils UML font cela pour toi je pense, et Netbeans a quelque chose en béta pour l'Enterprise pack... Vincent?
    Cela devient intéressant quand tu peux synchroniser ton modèle UML et ton code. Mais faut tout de même qu'il nous reste quelque chose à faire non?! De plus j'avoue que cela me fait toujours un peu peur d'automatiser trop, surtout quand après des concepts tel que celui-ci, passe un peu dans l'oubli!
    Je pense que les outils sont là pour nous aider, mais n'avons nous pas tendance à devenir escalave de nos outils pour le moment?
    Alex

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

Discussions similaires

  1. Réponses: 20
    Dernier message: 12/08/2014, 11h02
  2. Problème : Relation OneToMany/ManyToOne bidirectionnelle
    Par KrisWall dans le forum Doctrine2
    Réponses: 1
    Dernier message: 09/09/2012, 08h46
  3. Problème pour setter une Foreign Key avec TopLink(ValueHolderInterface)
    Par Kcintim dans le forum Persistance des données
    Réponses: 1
    Dernier message: 19/06/2011, 11h40
  4. foreign key non indexé
    Par olivanto dans le forum Oracle
    Réponses: 10
    Dernier message: 21/03/2007, 15h20
  5. Liste des foreigns key non indexés
    Par soazig dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/05/2006, 17h50

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