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 :

[Ejb 3.0] Comment gérer les relations ManyToMany avec attribut de relation


Sujet :

JPA Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 27
    Points
    27
    Par défaut [Ejb 3.0] Comment gérer les relations ManyToMany avec attribut de relation
    Bonjour,

    J'ai un petit soucis. J'essaye de représenter une relation avec mes ejb (et jpa) pour faire le mapping suivant :

    table A :
    id_a (PK)
    nom_a

    table B :
    id_b (PK)
    nom_b

    table intermédiaire :
    id_a, id_b
    pourcentage

    vient le moment de modéliser le mapping...

    J'ai eu beau chercher partout, je n'ai pas trouvé un seul exemple clair qui montre comment gérer les liens manytomany avec des attributs de relation.

    Il me semble que le tag @ManyToMany n'est pas adapté a mes besoins puisqu'il crée lui meme la table de lien et que je n'ai pas l'impression que je puisse lui spécifier quelque part mon attribut de lien.

    Pourtant, c'est un cas très courant en bdd d'avoir des liens 0..* et des attributs de lien, une solution doit donc exister

    Une bonne âme charitable pour m'aider ?

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    Février 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 7
    Points : 185
    Points
    185
    Par défaut
    Je me demande si tu ne dois pas utiliser les annotations @JoinTable et @JoinColumn (jette un coup d'oeil à la section @ManyToMany de http://www.devx.com/Java/Article/33906/0/page/2). Par contre je ne vois pas comment tu peux rajouter l'attribut pourcentage. Je creuse ça et revient vers toi.

    Antonio

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 27
    Points
    27
    Par défaut
    c'est justement comment modéliser les attributs de relation qui m'interesse, car j'ai au moins une dizaine de liens de ce type à migrer

    J'ai beau chercher, je ne vois pas trop comment faire, aucun exemple concert de trouvé en tout cas.

    EDIT :

    Bon a priori il semblerait que cela soit "non-supporté" par le mapping.

    Il faudrait donc alors passer par la création d'un ejb entité intermédiaire, qui fait le mapping de notre table de lien qui contient l'attribut de relation et mettre des relations one-to-many avec les 2 tables de départ...

    Quelqu"un a deja réalisé ceci ? (un lien one-to-many avec une clé composite et un attribut de relation ?)

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 27
    Points
    27
    Par défaut
    Bon je crois que je vais laisser tomber l'implémentation du mapping avec les ejb entity...

    Franchement, la documentation est quasi inexistante, et après pres d'une semaine de recherche sur le web, j'ai toujours pas trouvé de solution a mon problème, pourtant classique en base de données.

    A croire que tout le monde ne fais que du "tudu list" ou du "pet store" avec des relations one to one...

    Franchement, ca commence a me lasser. Y'a pas une seule documentation claire ni un seul tutorial clair.

    Alors ejb 3 la révolution... ouai pas au niveau de la doc en tout cas...


    Edit =>

    Après une semaine de recherche, hé bien il s'avère tout simplement que cela n'est pas faisable.

    Le seul et unique moyen est de créer une entité mappant la table intermédiaire puis de faire des relations oneToMany vers les autres entités...

    C'est donc "résolu" (mais ca reste surprenant...)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 23
    Points : 20
    Points
    20
    Par défaut Re UP
    Salut !

    Je suis aussi dans le même problème !! Et je trouve aussi ça bizarre que l'on puisse pas mapper un entity dans un manytomany (comme on le ferait dans un manytoone. Je sais pas comment ça serait possible "behind the scene" mais je pensais réellement que c'était possible !

    Est ce que quelqu'un a trouvé à part la dernière solution préconisée (que j'allais aussi tenter de faire : mais c'est vraiment lourd de le faire manuellement).

  6. #6
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut Un peu d'aide
    Bonjour,

    Bonjour agoncal, et merci pour GLG204 tu comprendras ... promo 2008

    Pour mon projet je suis en train de m'arracher les cheveux sur la relation ManyToMany avec Toplink. J'ai utilisé Netbeans pour "pomper", le modèle en fonction de la base. Il faut faire attention l'annotation @ManyToMany fonctionne pour moi dans un sens pas dans l'autre. J'ai posté un post précédent ou je déclare les classes obtenus.

    http://www.developpez.net/forums/d61...-recalcitrant/

    Par contre, je n'ai pas changé les classes, mais pour l'insert j'ai trouvé la solution.

    Remarque : la discipline existe en base, c'est mon point de départ !!

    Ma classe de test ....
    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
    22
    23
     
    @Test
        public void testCreateCompetence() {
            System.out.println("CreateCompetence");
            GeodeTabcomdom competence = new GeodeTabcomdom();
            GeodeDiscipline discipline = new GeodeDiscipline();
     
            CompetenceService instance = new CompetenceService(em);
            discipline = null;
     
            EntityTransaction tx = em.getTransaction();
            tx.begin();
            competence.setNom("Mathématique Evaluation");
            competence.setDescription("Description Evaluation math");
            competence.setCreatedAt(this.getDatedujour());
            competence.setUpdatedAt(this.getDatedujour());
            discipline =em.find(GeodeDiscipline.class,new Long(1));
            discipline.getTabcomdomIdCollection().add(competence);
            instance.saveTabComDom(discipline);
            tx.commit();
            System.out.println("Id : "+ discipline.getTabcomdomIdCollection().toString());
            assertNotNull(discipline);
        }
    et bien sûr la méthode save
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public GeodeDiscipline saveTabComDom(GeodeDiscipline discipline){
            if(discipline != null){
                em.merge(discipline);
            }
            return discipline;
        }
    J'ai fait un merge pour ratacher l'entité et insertion des collections

    et la miracle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    [TopLink Fine]: 2008.10.01 01:50:48.796--ServerSession(22057969)--Connection(20201168)--Thread(Thread[main,5,main])--SELECT ID, CLOSING_DATE, CREATED_AT, UPDATED_AT, DESCRIPTION, NAME FROM GEODE_DISCIPLINE WHERE (ID = ?)
        bind => [1]
    [TopLink Fine]: 2008.10.01 01:50:49.000--ServerSession(22057969)--Connection(4199273)--Thread(Thread[main,5,main])--SELECT t1.ID, t1.UPDATED_AT, t1.CLOSINGDATE, t1.DESCRIPTION, t1.NOM, t1.CREATED_AT FROM GEODE_TABCOMDOM_DISCIPLINE t0, GEODE_TABCOMDOM t1 WHERE ((t0.DISCIPLINE_ID = ?) AND (t1.ID = t0.TABCOMDOM_ID))
        bind => [1]
    [TopLink Fine]: 2008.10.01 01:50:49.015--ServerSession(22057969)--Connection(20201168)--Thread(Thread[main,5,main])--SELECT SEQ_ID_TABCOMDOM.NEXTVAL FROM DUAL
    [TopLink Fine]: 2008.10.01 01:50:49.031--ClientSession(18135083)--Connection(20712275)--Thread(Thread[main,5,main])--INSERT INTO GEODE_TABCOMDOM (ID, UPDATED_AT, CLOSINGDATE, DESCRIPTION, NOM, CREATED_AT) VALUES (?, ?, ?, ?, ?, ?)
        bind => [18, 2008-10-01, null, Description Evaluation math, Mathématique Evaluation, 2008-10-01]
    [TopLink Fine]: 2008.10.01 01:50:49.046--ClientSession(18135083)--Connection(20712275)--Thread(Thread[main,5,main])--INSERT INTO GEODE_TABCOMDOM_DISCIPLINE (TABCOMDOM_ID, DISCIPLINE_ID) VALUES (?, ?)
        bind => [18, 1]
    On voit l'insertion dans la table intermèdiaire.

    par contre, si je pars de l'autre bout, rien à faire ..??

    En tout cas, je vais continuer à décrypter JPA

    Dommage que les personnes qui implémente, JPA ne diffusent pas sur la manipulation des collections d'objets, les déclarations d'entités sont simples
    mais pour trouver des exemples de manipulations faut s'accrocher .

    olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    Natieb, excuse moi, mais je n'arrive pas à trouver si tu as réussi à résoudre le sujet de ce post.

  8. #8
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut Bonjour
    Bonjour,

    Effectivement, j'ai résolu ce post la solution est juste au dessus

    olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 27
    Points
    27
    Par défaut
    Comme j'ai reçu un mp à ce sujet, j'y reviens rapidement.

    Il n'est pas possible de décrire des liens many to many avec attribut de relation.
    Pas directement du moins.

    On transforme alors le mapping comme le fait la table dans la base de donnée, en rajoutant une entité intermédiaire et en faisant un mapping OneToMany et ManyToOne.

    En gros au lieu de :

    Melange-n------%-------m-Ingrédient

    on a 3 entités :
    Melange 1 -----n-Lien_Melange_Ingredient-m-----------1-Ingrédient

    C'est un tout petit peu coton à comprendre et à mettre en place au début, mais ça marche...

    Je bosse avec Jpa-Hibernate, mais le mapping est pareil avec toplink je pense.

    S'il faut vraiment un exemple "code", re-mp moi

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

Discussions similaires

  1. [2.x] [Form] Type pour une relation ManyToMany avec attributs
    Par FadeToBlack dans le forum Symfony
    Réponses: 10
    Dernier message: 09/08/2014, 03h46
  2. Comment gérer les dual SIM avec Android ?
    Par clavier12AZQSWX dans le forum Android
    Réponses: 3
    Dernier message: 13/01/2013, 00h21
  3. Persist relation ManyToMany avec attributs
    Par Trezegoals dans le forum Doctrine2
    Réponses: 3
    Dernier message: 22/08/2012, 21h55
  4. [2.x] Formulaire relation ManyToMany avec attributs
    Par Trezegoals dans le forum Symfony
    Réponses: 0
    Dernier message: 08/08/2012, 16h00
  5. Relation ManyToMany avec attribut
    Par icl1c dans le forum Doctrine2
    Réponses: 0
    Dernier message: 09/03/2012, 11h44

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