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
    997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : janvier 2009
    Messages : 997
    Points : 403
    Points
    403
    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
    997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : janvier 2009
    Messages : 997
    Points : 403
    Points
    403
    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 averti
    Profil pro
    Inscrit en
    janvier 2009
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2009
    Messages : 181
    Points : 307
    Points
    307
    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, 11h08
  2. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 16h10
  3. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 12h26
  4. CREATEFILEMAPPING qui ne fonctionne pas???
    Par Jasmine dans le forum MFC
    Réponses: 2
    Dernier message: 06/01/2004, 19h33
  5. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04

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