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 :

Problème avec multiple fetch EAGER


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 232
    Par défaut Problème avec multiple fetch EAGER
    salut,

    je travail avec jpa hibernate

    j'ai développer trois class qui ont des relations entre eux

    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
    @Entity
    public class Request implements Serializable{
     
     
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer requestId;
        private String detailRequest;
     
        private String place;
     
     
     
            @ManyToMany(mappedBy="requests",fetch=FetchType.EAGER)
        private List<Expertise> expertises;
     
     
    ...
    //getter , setter and constructor
    }
    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
    @Entity
    public class Expertise implements Serializable {
     
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
         @Id
         @GeneratedValue(strategy = GenerationType.AUTO)
        private int idExpertise;
        private String seniority;
        @ManyToMany(mappedBy="expertises",fetch=FetchType.EAGER)
        private List<TechnicalSkill> technicalSkills=new ArrayList<TechnicalSkill>();
     
     
        @ManyToMany
        private List<Request> requests=new ArrayList<Request>();
     
     
     
    ....
    //getter , setter and constructor
    }

    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
    @Entity
    public class TechnicalSkill implements Serializable{
     
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
     
         @Id
         @GeneratedValue(strategy = GenerationType.AUTO)
        private int idTechnicalSkill;
        private String description;
        @ManyToMany
        private List<Expertise> expertises=new ArrayList<Expertise>();
     
    ...
    //getter , setter and constructor
    }

    le but est de récupérer les informations ( information de "request" et leur "expertise" et leur "TechnicalSkill" d'une demande bien specifique

    mais quand j'ai exécuté ces class dans jboss cette erreur est affiché


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Caused by: org.hibernate.HibernateException: cannot simultaneously fetch multiple bags

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 251
    Par défaut
    Parceque tes collections sont en EAGER, Hibernate effectue une grosse requête SQL afin d'optimiser le chargement de tes collections (par jointure ouverte).
    Si tu regardes bien les résultats de cette requête SQL, tu t'apercevras que les objets correspondant à tes collections sont présents plusieurs fois dans les résultats.
    Les objets étant présents plusieurs fois dans les résultats, Hibernate a besoin d'une implémentation qui garantisse une présence unique des objets dans la collection ce qui n'est pas le cas des java.util.List car tu peux très bien ajouter x fois le même objet dans une ArrayList.
    C'est parcequ'hibernate ne peux pas dédoublonner les résultats de ton resultset qu'il refuse de mapper tes collections.
    Si tu souhaites conserver un fetch eager sur tes collections, il faut que tu utilise des java.util.Set au lieu des java.util.List car un HashSet par exemple te garantit qu'il n'y a pas deux fois le même objet dans la liste.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut
    Pour une fois, je peux peut-être aidé quelqu'un.

    J'ai eu ce problème dernièrement.
    En complément de ce que dis NoClassDefFound, tu peux garder tes List, sous 2 conditions :
    - créer les méthodes hashCode et equals (ca se fait tout seul avec Eclipse) pour garantir l'unicité de tes Expertise. (equals sur juste l'id suffit)
    - il faut juste que tu rajoutes @Fetch(value = FetchMode.SUBSELECT) sous ton @ManyToMany.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            @ManyToMany(mappedBy="requests",fetch=FetchType.EAGER)
            @Fetch(value = FetchMode.SUBSELECT)
            private List<Expertise> expertises;

  4. #4
    Membre très actif Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Par défaut
    Citation Envoyé par Turvy Voir le message
    Pour une fois, je peux peut-être aidé quelqu'un.

    J'ai eu ce problème dernièrement.
    En complément de ce que dis NoClassDefFound, tu peux garder tes List, sous 2 conditions :
    - créer les méthodes hashCode et equals (ca se fait tout seul avec Eclipse) pour garantir l'unicité de tes Expertise. (equals sur juste l'id suffit)
    - il faut juste que tu rajoutes @Fetch(value = FetchMode.SUBSELECT) sous ton @ManyToMany.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            @ManyToMany(mappedBy="requests",fetch=FetchType.EAGER)
            @Fetch(value = FetchMode.SUBSELECT)
            private List<Expertise> expertises;
    et ben tu aides au moins deux !!
    Merci !!!
    ça marche

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 44
    Par défaut
    merci tu aides deja 3

  6. #6
    Membre très actif Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Par défaut
    Salut,
    je suis tombé sur une autre solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // Liste des relations Pere-fils
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "objPere", targetEntity = NomClassFils.class)
    @LazyCollection(LazyCollectionOption.FALSE)
    Citation Envoyé par hastiok Voir le message
    merci tu aides deja 3

Discussions similaires

  1. [MySQL] Problème avec mysql fetch array
    Par berko dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 22/04/2013, 07h24
  2. probléme avec PDO fetch
    Par ryodo dans le forum Langage
    Réponses: 9
    Dernier message: 26/04/2011, 15h27
  3. [PDO] Problème avec un FETCH
    Par kanabzh29 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 26/10/2008, 15h17
  4. Réponses: 2
    Dernier message: 25/06/2007, 14h36
  5. Réponses: 22
    Dernier message: 05/07/2005, 00h04

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