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 :

[JPA] fetch Lazy qui ne fonctionne pas


Sujet :

JPA Java

  1. #1
    Membre averti
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 014
    Points : 407
    Points
    407
    Billets dans le blog
    1
    Par défaut [JPA] fetch Lazy qui ne fonctionne pas
    Bonjour, j'ai un annuaire, chaque utilisateur s'inscrit et peut inscrire autant de site qu'il le souhaite.
    J'ai donc les entité MappedSite et MappedUsers :
    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
    @Table(name = "site")
    public class MappedSite extends MappedSuper implements Serializable {
    [...]
        @JoinColumn(name = "id_user", referencedColumnName = "id")
        @ManyToOne(fetch = FetchType.LAZY)
        private MappedUsers idUser;
    [...]
    }
     
    @Entity
    @Table(name = "users")
    public class MappedUsers implements Serializable {
    [...]
        @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "idUser")
        private Collection<MappedSite> mappedSiteCollection;
    [...]
    }
    Sur ma page d'accueil je liste les derniers sites inscrit, je ne fais à aucun moment référence à l'utilisateur, je n'invoque pas getIdUsers

    en gros j'utilise simplement un Criteria query avec une limit et un offset (qui est de 0 quand on charge la page)
    je me suis mis en mode debug et j'ai vu énormément de requêtes uniques vers la table users du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [EL Fine]: sql: 2019-05-21 03:26:47.653--ServerSession(1843021226)--Connection(1504957408)--Thread(Thread[http-nio-8443-exec-187,5,main])--SELECT ... FROM users WHERE (id = ?)
    	bind => [208]
    Alors que je n'utilise pas d'objet MappedUsers, nul part, et ça m'ennuie car ces requêtes sont inutile le Lazy Loading semble ne pas fonctionner ?
    Merci pour votre aide.

  2. #2
    Membre averti
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 014
    Points : 407
    Points
    407
    Billets dans le blog
    1
    Par défaut
    Bonjour, dans mes log j'ai ce genre de message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [EL Warning]: metadata: 2019-05-21 07:08:13.553--ServerSession(1735190163)--Reverting the lazy setting on the OneToOne or ManyToOne attribute [idUser] for the entity class [class mapping.MappedSite] since weaving was not enabled or did not occur.
    j'ai cherché un peu sur internet sans trouver de réelles solutions j'ai juste ajouté dans les properties de mon persistence xml cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                <property name="eclipselink.weaving" value="static"/>
    Mais l'erreur revient.
    Merci.

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 451
    Points : 881
    Points
    881
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Effectivement, tu a un lien entre MappedSite et MappedUsers.

    Pour commencer, il est coutume d'utiliser des Set (et non des Collection) pour s'assurer que chaque objet est unique.

    Bon, plaçons nous sur MappedUsers.

    Il y a un lien entre MappedSite et MappedUsers. Il est bidirectionnel.

    Il existe évidement en BDD dans les deux sens.

    Si c'est LAZY, Hibernate (JPA) chargera MappedUsers mais il ne prendra pas la peine de charger les MappedSite qui lui sont liés.
    Effectivement on signale qu'il y a un lien, mais on le donne à titre indicatif.
    Par LAZY, on explique à Hibernate (JPA) que le lien existe mais qu'il ne faut pas charger les classes liées.

    Pour charger les classes liées, il faut remplacer LAZY par EAGER.

    Notons que cette question est fondamentale, en particulier pour les performances.

    Dans tons cas, je pense qu'il faut EAGER dans MappedUsers et LAZY dans MappedSite.

    Cordialement.

Discussions similaires

  1. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 12h08
  2. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 17h10
  3. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 13h26
  4. CREATEFILEMAPPING qui ne fonctionne pas???
    Par Jasmine dans le forum MFC
    Réponses: 2
    Dernier message: 06/01/2004, 20h33
  5. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 11h04

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