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 :

Lazy et sérialisation


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Par défaut Lazy et sérialisation
    Bonjour,

    J'ai défini une relation avec LAZY

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY)
    @JoinTable(name = "cours_eleve")
    public Set<Cours> getCours() {
    return cours;
    	}
    Lorsque je retourne l'objet et que je veux parcourir la liste, j'ai cette erreur.
    An attempt was made to traverse a relationship using indirection that had a null Session.This often occurs when an entity with an uninstantiated LAZY relationship is serialized and that relationship is traversed after serialization.To avoid this issue, instantiate the LAZY relationship prior to serialization.
    Comment je peux contourner ce problème en gardant l'attribut lazy ?

    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Par défaut
    La solution était de mettre un .getSize() sur la liste dans la méthode qui charge l'entité.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Oui ça marche. Tu peux aussi faire une requête et utiliser un "fetch join" sur ta collection pour la charger.
    Je trouve ça plus lisible. Le getSize est plus une bidouille à mon sens (même si ça fonctionne).
    La requête te permet en la lisant de bien comprendre ce que tu souhaites faire.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Par défaut
    Merci pour ta réponse.

    Citation Envoyé par fr1man Voir le message
    Oui ça marche. Tu peux aussi faire une requête et utiliser un "fetch join" sur ta collection pour la charger.
    Je trouve ça plus lisible. Le getSize est plus une bidouille à mon sens (même si ça fonctionne).
    La requête te permet en la lisant de bien comprendre ce que tu souhaites faire.
    1) Si je fais une requête et un fetch join, ça ne sert à rien de définir ma liste de la façon suivante, c'est juste ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        @ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY)@JoinTable(name = "eleve_cours")
        public Set<Cours> getCours() {
    returncours;
        }

    2) Pour ma compréhension, un getSize() ne charge pas les objets en relation dans une liste lazy, c'est juste ?

    merci

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Si, cela a un intérêt, car de base tu sais que ton objet ne chargera pas ses collections.
    Il est donc préférable de mettre un lazy sur les collections.
    Comme ça, en fonction des requêtes que tu crées, tu peux charger ou non les collections qui t'intéressent.

    J'aurais tendance à dire que getSize permet de charger la collection mais je ne l'utilise jamais dans cette optique.

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    En JPA, les collections d'entités sont implémentées par l'ORM utilisé par des proxies, et des fonctions comme .size() peuvent être implémentées de différentes manières,
    et il n'y aucune garantie que leurs effets de bord soient portables d'un ORM à l'autre, ni identiques d'une version à l'autre d'un même ORM ou même d'une configuration à l'autre.
    Il est même possible de configurer - avec certains ORMs - chaque mapping séparément pour qu'il génère un "SELECT COUNT()..." pour obtenir la taille sur l'appel à .size().

    La seule solution est de toujours accéder les objets dans un contexte transactionnel à travers la couche "repository".
    Et vous pouvez aussi utiliser les Entity Graphs (JPA 2.1+) pour charger exactement ce dont vous avez besoin en fonction des circonstances,
    le fetch mode de l'annotation sur la collection peut alors être vu comme le mode "par défaut" si un entity graph n'est pas utilisé.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    Et vous pouvez aussi utiliser les Entity Graphs (JPA 2.1+) pour charger exactement ce dont vous avez besoin en fonction des circonstances,
    le fetch mode de l'annotation sur la collection peut alors être vu comme le mode "par défaut" si un entity graph n'est pas utilisé.
    Merci ! Bien ces Entity Graphs !

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

Discussions similaires

  1. [Sérialisation] d'objets de types différents
    Par Amnesiak dans le forum Général Java
    Réponses: 3
    Dernier message: 08/12/2004, 22h28
  2. [Sérialisation] StackOverFlowError levée
    Par ptitjack dans le forum Général Java
    Réponses: 9
    Dernier message: 04/11/2004, 13h27
  3. [Serializable][image] Sérialiser une image
    Par Galima dans le forum Graphisme
    Réponses: 7
    Dernier message: 01/07/2004, 18h12
  4. Sérialisation avec sockets
    Par sebi77 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/05/2004, 20h24
  5. SGBD ou sérialisation
    Par tiboleo dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 07/10/2003, 16h18

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