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 :

JPA Update ne marche pas dans une relation @ManyToMany


Sujet :

JPA Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 32
    Points : 34
    Points
    34
    Par défaut JPA Update ne marche pas dans une relation @ManyToMany
    Bonjour tout le monde,

    Comme dit dans le titre, j'ai un problème au niveau de l'update dans une relation @ManyToMany.

    J'ai 3 tables :

    - customer(idCustomer,...)
    - is_managed(idCustomer,idPerson)
    - sales_person(idPerson,...)

    J'ai donc une table de jointure entre customer et sales_person nommée is_managed(d'où ma relation @ManyToMany).

    Lorsque je crée mon customer via un formulaire, tout se passe correctement : mes 3 tables sont remplies.
    Lorsque je supprime un customer, là aussi, aucun problème, tout est supprimé correctement dans mes 3 tables.
    Mais lorsque je veux modifier mon customer, par exemple enlever une sales_person rattachée à celui-ci, la table de jointure is_managed est bien mise à jour, mais pas la table sales_person

    Exemple :

    1) Création du customer cu1 avec 2 sales_person (s1, s2)
    2) Modification de cu1 : suppression d'une des sales_person s2

    La s2 n'existe plus dans is_managed mais existe toujours dans sales_person...

    Voici comment je modifie mon customer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // update customer
    public String updateCustomer(Customer customer,ArrayList<Sales_person> sales_persons,ArrayList<Involved_group_relation> involved_groups, Macro_market macro_market)throws IOException {
     
       // insert the sales_person attached to the customer
       ArrayList<Sales_person> sales_personC = new ArrayList<Sales_person>();
       sales_personC.addAll(sales_persons);
     
        customer.setSalesPersons_BelongTo(sales_personC); // insert in customer the sales_persons
     
        em.merge(customer);
        return customer.getNameCustomer();
    }
    Et Voici le code de mes 2 entités :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    // entity customer
    @Entity
    @Table(name="customer")
    public class Customer implements Serializable {
     
        private static final long serialVersionUID = 1L;
     
        @Id
        @GeneratedValue( strategy = GenerationType.IDENTITY)
        private Long idCustomer;
     
        private String titleTypeAccount;
        private String nameCustomer;
     
        /** RELATIONS **/
        // CUSTOMER - SALES_PERSON
        @ManyToMany(
                cascade={CascadeType.ALL}
        )
        @JoinTable(
            name="is_managed",
            joinColumns=@JoinColumn(name="idCustomer"),
            inverseJoinColumns=@JoinColumn(name="idPerson")
        )
        private Collection<Sales_person> salesPersons_BelongTo;
            ...
            ...
     
    // entity sales_person
    @Entity
    @Table(name="sales_person")
    public class Sales_person implements Serializable {
     
        private static final long serialVersionUID = 1L;
     
        @Id
        private Long idPerson;
     
        private String nameSalesPerson;
        private String jobFunction;
        private String titleOrganization;
     
        @ManyToMany(
            cascade={CascadeType.ALL},
            mappedBy="salesPersons_BelongTo"
        )
        private Collection<Customer> customers;
        ...
        ...
    J'utilise uniquement un merge sur mon entité customer...est-ce que je dois faire un traitement au niveau de salesPerson?

    Merci pour votre aide!

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 196
    Points : 242
    Points
    242
    Par défaut
    Je ne suis pas certains mais à mon avis le CascadeType.ALL ne suffit pas, essaye en ajoutant ceci : cascade = {CascadeType.ALL, CascadeType.DELETE_ORPHAN} ou avec orphanRemoval=true.
    Regarde ce post qui traite du même sujet que le tien

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 32
    Points : 34
    Points
    34
    Par défaut
    Merci pour ta réponse oliv37, mais je n'utilise pas le framework hibernate. J'utilise directement les bibliothèques de JPA (javax.persistence.CascadeType)

    Du coup, CascadeType.DELETE_ORPHAN n'existe pas

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 196
    Points : 242
    Points
    242
    Par défaut
    mais orphanRemoval ça existe il me semble en JPA

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 32
    Points : 34
    Points
    34
    Par défaut
    Hum, il ne reconnaît pas orphanRemoval sur une relation @ManyToMany

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 196
    Points : 242
    Points
    242
    Par défaut
    C'est vrai orphanRemoval n'existe que pour les relation @OneToOne et @OneToMany, du coup je ne sais pas si tu peux le faire en utilisant les annotations JPA, sinon il faut le faire manuellement !

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 32
    Points : 34
    Points
    34
    Par défaut
    Yes, et c'est ça que je n'arrive pas à faire (et du coup à comprendre...).

    L'entité Customer contient une Collection de type <Sales_person> .

    Avant de faire mon merge,
    j'insère dans cette collection les "sales_person": soit il y en a des nouvelles, soit ce sont les mêmes, soit j'en ai supprimées.

    Par exemple, si ma collection ne contient plus que 1 seule "sales_person" attachée à mon customer au lieu de 2, ma table sales_person devrait être mise à jour automatiquement...mais ce n'est pas le cas.

    As-tu une idée pour mettre à jour manuellement cette table?

  8. #8
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 196
    Points : 242
    Points
    242
    Par défaut
    Quand tu mets à jour ta collection de Sales_Person, il va mettre à jour ta table de relation is_managed mais il ne va pas supprimer directement les sales_person.

    Une solution possible serait de faire la différence entre ton ancienne collection customer.getSalesPersons_BelongTo() et ta nouvelle collection de sales_person sales_personC.
    Ainsi les sales_person qui sont présents dans l'ancienne collection mais pas dans la nouvelle (et qui ne sont pas liés à un autre customer), tu les supprimes manuellement -> em.remove(sale_person).

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 32
    Points : 34
    Points
    34
    Par défaut
    Thank's oliv37 , it works!
    J'ai comparé mes deux collections et je fais ensuite un remove sur sales_person.

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

Discussions similaires

  1. Tri ne marche pas dans une datagrid remplie depuis une BDD
    Par TrexXx dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 15/01/2011, 16h42
  2. Réponses: 0
    Dernier message: 19/04/2009, 20h50
  3. Réponses: 1
    Dernier message: 22/06/2008, 22h47
  4. 'Limit' ne marche pas dans une sous requete !?
    Par walou dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/09/2007, 13h06

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