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 :

Récupérer toutes les données en une fois depuis la base.


Sujet :

Persistance des données Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut Récupérer toutes les données en une fois depuis la base.
    Bonjour,

    J'ai actuellement un objet métier qui contient plusieurs données membres dont deux collections d'élément.
    Je souhaiterais récupérer cet objet avec toutes ses données membres depuis ma base de donnée.

    Cependant, lorsque je le récupère j'ai une erreur :
    failed to lazily initialize a collection of role: .... no session or session was closed

    Il apparait en effet que je ne puisse définir
    @OneToMany(fetch = FetchType.EAGER) sur plus d'une collection en même temps ...

    Voici la définition de mes deux collections du coup, qui provoque cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @OneToMany(fetch = FetchType.EAGER)
    	@Cascade(CascadeType.ALL)
    	private List<Document> documents;
     
    @CollectionOfElements	
    	@Cascade(value={CascadeType.ALL, CascadeType.DELETE_ORPHAN})
    	private List<Signature> protagonistes;
    Comment faire alors dans ce cas pour récupérer toutes les informations ? Faut il faire une requete suplémentaire pour associer les valeurs les unes aux autres. Pour l'instant ma requete est simple :

    List<Object> results = session.createQuery("from Dossier").list();

    Il semble ma session récupère les dossiers. Puis, donc, ferme la session courante... Ce qui empèche par la suite de récupérer le reste ? Je ne comprends pas bien se qui se produit ... ???

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par zuzuu Voir le message
    Bonjour,

    J'ai actuellement un objet métier qui contient plusieurs données membres dont deux collections d'élément.
    Je souhaiterais récupérer cet objet avec toutes ses données membres depuis ma base de donnée.

    Cependant, lorsque je le récupère j'ai une erreur :
    failed to lazily initialize a collection of role: .... no session or session was closed

    Il apparait en effet que je ne puisse définir
    @OneToMany(fetch = FetchType.EAGER) sur plus d'une collection en même temps ...

    Voici la définition de mes deux collections du coup, qui provoque cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @OneToMany(fetch = FetchType.EAGER)
    	@Cascade(CascadeType.ALL)
    	private List<Document> documents;
     
    @CollectionOfElements	
    	@Cascade(value={CascadeType.ALL, CascadeType.DELETE_ORPHAN})
    	private List<Signature> protagonistes;
    Comment faire alors dans ce cas pour récupérer toutes les informations ? Faut il faire une requete suplémentaire pour associer les valeurs les unes aux autres. Pour l'instant ma requete est simple :

    List<Object> results = session.createQuery("from Dossier").list();

    Il semble ma session récupère les dossiers. Puis, donc, ferme la session courante... Ce qui empèche par la suite de récupérer le reste ? Je ne comprends pas bien se qui se produit ... ???
    le EAGER est une optimisation qui tente de charger les records liés via un seul select, il est donc normal que l'on ne puisse charger qu'un seul ensemble de records liés à la fois… (essayez à la main en SQL pour vous en convaincre…)

    pour résoudre votre situation :
    vous avez besoin d'un "service" : une méthode qui sera transactionnelle et dans laquelle vous allez charger l'entité "racine" de votre arborescence et ensuite accéder à chacun des membres de type "collection" (List<> ou Map<>) qui contiennent les entités de l'arborescence… (une sorte de "touch"…), automatiquement l'ORM chargera par de nouvelles requêtes les collections et comme vous serez dans une méthode transactionnelle, vous n'aurez plus la "lazy exception"…

    et évidemment si dans les entités "collectionnées", il y en a qui ont elles aussi des collections : il faudra agir récursivement…

    tout cela devant provoquer un beau "out of memory" si votre arborescence est trop importante par rapport à ce que vous allouez (ou pouvez allouer) à votre JVM…

  3. #3
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Il est possible de mémoire de contourner ce problème en utilisant des Set plutôt que des listes. Le problème est que par défaut pour une liste, Hibernate utilise la sémantique de Bag, et qu'il est impossible de récupérer les données simultanément pour deux "bags".

    Voir http://www.jroller.com/eyallupu/entr...fetch_multiple
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par Patriarch24 Voir le message
    Il est possible de mémoire de contourner ce problème en utilisant des Set plutôt que des listes. Le problème est que par défaut pour une liste, Hibernate utilise la sémantique de Bag, et qu'il est impossible de récupérer les données simultanément pour deux "bags".

    Voir http://www.jroller.com/eyallupu/entr...fetch_multiple
    utiliser des Set plutôt que des List à d'autres effets de bord…
    en termes du nombre de roundtrips effectués vers le repository notamment…

Discussions similaires

  1. [AJAX] Récupérer toutes les données d'une BDD
    Par OurysBack dans le forum AJAX
    Réponses: 0
    Dernier message: 12/11/2014, 11h28
  2. [XL-2007] Récupérer toutes les données d'une ligne liées a un indice
    Par cwamm dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/10/2014, 17h26
  3. [Batch] Récupérer toutes les tables d'une base de données
    Par Centonni dans le forum Spring
    Réponses: 2
    Dernier message: 16/09/2012, 11h58
  4. récupérer les données d'une cellule depuis un UserForm
    Par domy59 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/12/2008, 00h09
  5. récupérer juste les données d'une autre table
    Par rangernoir dans le forum Access
    Réponses: 5
    Dernier message: 13/09/2005, 14h52

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