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

Hibernate Java Discussion :

OneToMany Fetch Eager : Multiple répétition


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 38
    Par défaut OneToMany Fetch Eager : Multiple répétition
    Bonjour !

    Je me heurte à un problème lors de la récupération d'une liste d'objets sous forme de Liste en fetch Eager. Pour poser la situation, voilà les 2 classes concernées :

    Contractualisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    //bi-directional many-to-one association to Licence
    @OneToMany(cascade = {CascadeType.ALL},mappedBy="contractualisation",fetch=FetchType.EAGER)
    private List<Licence> licences;
    ...
    Licence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    @ManyToOne
    @JoinColumn(name="contractualisation_idcontractualisation")
    private Contractualisation contractualisation;
    ...
    Le problème c'est que lors de la récupération des objets de la liste, il affiche un très grand nombre de répétitions de la même licence (à peu près une centaine).

    J'ai cru comprendre que c'était du à une jointure externe sans distinct mais je ne vois pas comment faire en sorte qu'il ne me récupère qu'une seule itération de chaque ligne.

    J'aurais pu ne pas utiliser de fetch Eager mais j'ai besoin de récupérer les objets de cette liste car j'utilise des variables transcient que je souhaite stocker dans la classe Contractualisation, sans pour autant les stocker sur la bdd.

    J'ai malheureusement rencontré le même problème avec la fonction find de l'entity manager donc j'avoue ne pas trop savoir quoi faire pour résoudre ce problème.

    Merci d'avance pour votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 38
    Par défaut
    Bonjour,

    J'ai trouvé un élément qui "explique" le nombre de répétition de chaque licence, c'est lié à une autre variable oneToMany qui est de type Set dans l'entité Contractualisation et le nombre de répétition de chaque licence correspond exactement au nombre d'élément dans ce Set :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    @OneToMany(mappedBy="contractualisation",cascade = {CascadeType.ALL},fetch=FetchType.EAGER,targetEntity=ContractualisationHasEtatdecontractHasClient.class)
    private Set<ContractualisationHasEtatdecontractHasClient> listEtatdecontractualisation;
    Le problème disparait quand je passe cette variable en FetchType Lazy. Le problème encore une fois, c'est que je n'ai aucun moyen de faire en sorte de laisser le fetch à lazy pour cette variable (étant donné que j'utilise ce set pour rechercher un élément et le stocker dans une variable transient).

    Soit hibernate a des ratés (ce qui apparemment est probable), soit c'est un mécanisme logique et j'aimerai connaitre le raisonnement derrière et avoir des pistes de contournement.

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 3
    Par défaut Voici la solution
    Ajoute @Fetch(value = FetchMode.SUBSELECT) ou @Fetch(value = FetchMode.SELECT) en haut de ta déclaration OneToMany. Ce qui va te donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @Fetch(value = FetchMode.SELECT)
    @OneToMany(mappedBy="contractualisation",cascade = {CascadeType.ALL},fetch=FetchType.EAGER,targetEntity=ContractualisationHasEtatdecontractHasClient.class)
    private Set<ContractualisationHasEtatdecontractHasClient> listEtatdecontractualisation;
    Regarde sur cette page pour plus d'info : http://256.com/gray/docs/misc/hibern...lections.shtml

Discussions similaires

  1. Problème avec multiple fetch EAGER
    Par alen22 dans le forum JPA
    Réponses: 5
    Dernier message: 06/06/2013, 16h47
  2. [EJBQL] multiple left join fetch
    Par joploya dans le forum Java EE
    Réponses: 0
    Dernier message: 16/11/2011, 09h41
  3. Update d'une collection many-to-one avec fetch=eager
    Par totoranky dans le forum Hibernate
    Réponses: 0
    Dernier message: 16/07/2010, 18h16
  4. OneToMany avec fetch = FetchType.EAGER
    Par coold dans le forum JPA
    Réponses: 38
    Dernier message: 23/09/2009, 11h55

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