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

Persistance des données Java Discussion :

Spring : manyToMany qui récupère les données mappées de façon incomplète


Sujet :

Persistance des données Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2022
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Spring : manyToMany qui récupère les données mappées de façon incomplète
    Spring boot 2.5.6


    (1) méthode 1

    Profil.java
    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
    ```java
    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    @EqualsAndHashCode
    @FieldDefaults(level = AccessLevel.PRIVATE)
    @Table(name = "t_profil")
    public class Profil {
    ...
    ...
        @ManyToMany(cascade =  {
                CascadeType.PERSIST,
                CascadeType.MERGE
            }, fetch = FetchType.LAZY)
        @JoinTable(
                name = "t_profils_fonctionnalites",
                joinColumns = { @JoinColumn(name = "profil_id") },
                inverseJoinColumns = { @JoinColumn(name = "fonctionnalite_id") }
        )
        public Set<Fonctionnalite> fonctionnalites  = new HashSet(); 
    }
    ```
    Fonctionnalite.java
    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
    ```java
    @jakarta.persistence.Entity
    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    @EqualsAndHashCode
    @FieldDefaults(level = AccessLevel.PRIVATE)
    @Table(name = "t_fonctionnalite")
    public class Fonctionnalite {
    ...
    ...
        @ManyToMany(mappedBy = "fonctionnalites", fetch = FetchType.LAZY)
        private Set<Profil> profils   = new HashSet();  
    ```

    j'ai vérifié plusieurs fois, les insertions sont correctes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ```
    profil fonctionnalite
    1         1
    1         2
    2         1
    2       4
    ```
    controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ```java
    ...
        	List<Profil> profilList= profilDao.findAll();
        	profilList.forEach(profil -> { profil.getFonctionnalites(); });      // je fais appel à getFonctionnalites();   pour le LAZY
            return new ResponseEntity<>(profilList, HttpStatus.OK);
    ```

    j'obtiens ces données :
    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
    ```
    [
        {
            "id": 1,
            "code": "CODEP1",
            "label": "defaut",
            "description": "defaut description1",
            "fonctionnalites": [
                {
                    "id": 1,
                    "code": "codeF1",
                    "label": "labelF1",
                    "description": "descriptionF1",
                    "profils": []
                }
            ]      
        },
        {
            "id": 2,
            "code": "CODEP2",
            "label": "label2",
            "description": "description2",
            "fonctionnalites": []        
        },
    ...
    ...
    ```
    les fonctionnalités des profils sont soit incomplète, soit manquante!

    (2)
    mis le fetch.eager sur Profil

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ```
        @ManyToMany(cascade =  {
                CascadeType.PERSIST,
                CascadeType.MERGE
            }, fetch = FetchType.EAGER)
        @JoinTable(
    ```
    les fonctionnalités des profils sont soit incomplète, soit manquante!


    ** les résultats sont différents entre (1) et (2) mais toujours fausses !

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur en génie logiciel
    Inscrit en
    Juin 2012
    Messages
    856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en génie logiciel
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 856
    Points : 2 442
    Points
    2 442

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2022
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    j'ai fait comme le site mais je récupère toujours que quelques fonctionnalités dans les profils

    Profil
    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
     
        @ManyToMany(cascade =  {
                CascadeType.ALL,
            }, fetch = FetchType.EAGER)
        @JoinTable(
                name = "t_profil_fonctionnalite",
                joinColumns = { @JoinColumn(name = "profil_id") },
                inverseJoinColumns = { @JoinColumn(name = "fonctionnalite_id") }
        )
        public Set<Fonctionnalite> fonctionnalites  = new HashSet(); 
     
        public void addFonctionnalite(Fonctionnalite fonctionnalite) {
            this.fonctionnalites.add(fonctionnalite);
            fonctionnalite.getProfils().add(this);
       }
     
       public void removeFonctionnalite(long fonctionnaliteId) {
    	    Fonctionnalite fonctionnalite = this.fonctionnalites.stream().filter(t -> t.getId() == fonctionnaliteId).findFirst().orElse(null);
    	    if (fonctionnalite != null) {
    	        this.fonctionnalites.remove(fonctionnalite);
       	        fonctionnalite.getProfils().remove(this);
                }
       }

    controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        	List<Profil> profils = new ArrayList<Profil>();
        	profilDao.findAll().forEach(profils::add);
            return new ResponseEntity<>(profils, HttpStatus.OK);

    ça fait 1 semaine que je cherche

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur en génie logiciel
    Inscrit en
    Juin 2012
    Messages
    856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en génie logiciel
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 856
    Points : 2 442
    Points
    2 442
    Par défaut
    enlève @EqualsAndHashCode

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2022
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    merci, tu me sauve la life.
    c'etait bien ça !

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur en génie logiciel
    Inscrit en
    Juin 2012
    Messages
    856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en génie logiciel
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 856
    Points : 2 442
    Points
    2 442
    Par défaut
    en fait par défaut avec l'annotation il doit utiliser tous les champs de la classe... or il faudrait plutôt spécifier que l'id

  7. #7
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    merci pour la précision !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/10/2009, 22h18
  2. formulaire qui transforme les données!
    Par xave dans le forum Langage
    Réponses: 11
    Dernier message: 03/07/2006, 11h58
  3. Réponses: 2
    Dernier message: 31/05/2006, 09h58
  4. Requête qui récupère les droits d'un utilisateur
    Par peck dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 20/04/2006, 09h40
  5. comment récupéré les données d'un popus?
    Par srikta dans le forum ASP
    Réponses: 6
    Dernier message: 12/04/2006, 13h44

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