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 :

[Hibernate] Comment créer dynamiquement un fetching plan


Sujet :

Hibernate Java

  1. #1
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Points : 130
    Points
    130
    Par défaut [Hibernate] Comment créer dynamiquement un fetching plan
    Voila mon pb:
    g une classe (produit) qui contient des listes (one-to-many) et des many-to-one

    Dans ma couche de présentation, je r&cupère cet objet au travers des méthodes de ma dao: parfois j'ai uniquement besoin d'accéder aux proporiétés de ma classes (chargée par défaut) mais dans d'autre cas g également besoin de charger le contenu de certaine relation dans les listes.

    Je ne peux donc pas déclarer ce qui sera automatiquement chargé dans le descripteur car cela dépend des cas

    Comment peut on le faire de facon programmatique, au moment de l'éxécution donc...

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 274
    Points : 307
    Points
    307
    Par défaut
    Bonjour,

    le chargement tardif (lazy=true dans le fichier de mapping) repond à ton problème.
    Les objets liés ne sont chargés que lorsqu'ils sont accédés.

    Sinon tu peux faire deux méthodes de récupération de ta classe Produit :
    une qui ne récupere que les infos de la classe de base (en sql natif)
    une autre qui récupère toutes les classes lièes.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    comme le dit pietra, les lazy initialisation fournis par Hibernate repondent a ton probleme...

    Pour charger le contenu d une relation via Hibernate, utilise ensuite le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Hibernate.initialise(root.getList1());

    Sun Certified Business Component Developer
    Sun Certified Java Programmer
    --
    The definitive toolbox for GWT applications: gwt-toolbox
    My blog about Java and JEE: Benjamin's Blog

  4. #4
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Points : 130
    Points
    130
    Par défaut
    merci pietra
    par contre je ne veux pas de lazy = false car je n'ai pas tjs besoin de charger les classes liées

    plus concretement:

    g un produit qui a une liste de caractéristique et qui possede un état.
    g 3 fonctions:
    * Produit getProduit (int numP) qui me retourne le produit sans pouvoir accéder à la liste de Caractéristique (car g mis lazy=true)
    * getFicheProduit(int numP) qui me retourne le produit + la liste de carac + d'autres données (état, constructeur, notes, ...)
    * Produit getCaractéristique(Produit p) qui doit se charger de repeupler le produit avec la liste de caractéristique

    Le but est d'optimiser les requetes en fonction des besoins

    ex:
    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
     
     public dao2.Produit getProduitById(int numProduit) throws Exception {
            Session session = HibernateUtil.currentSession();
            Transaction tx = session.beginTransaction();
     
            dao2.Produit prod = (dao2.Produit) session.get(dao2.Produit.class, numProduit);
        // chargement des classes liées
            prod.getEtatP();
            prod.getConstructeur();
            prod.getCategorie();
            prod.getListCaract();
     
            tx.commit();
            HibernateUtil.closeSession();
            return prod;
        }
    et ca ne charge rien du tout!
    d'ailleurs quel est la différence entre get et load sous Hibzernate3 ( a part la levé d'exception / retourne null)???

    Ensuite quand ma couche de présentation accede au produit retourné, elle leve l'erreur de connexion close!

    DOnc mes questions sont:
    1- comment chargé réelement les classes liées avant de fermer la session
    2- comment peupler un objet détaché dans une autre session
    3 - différence entre get/load


    merci

  5. #5
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Points : 130
    Points
    130
    Par défaut
    désolé g pas vu la dernière réponse
    merci benji

    ca marche avec initialize!

    par contre il me fait ca en plusieurs requetes (une a chaque initialize)
    on peut lui préciser de faire des jointures?

    *edit*
    tient c bizare, en regardant les log il charge bien la liste mais ensuite il delete la relation avant de réinsérer les données??!!!!

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par mauvais_karma
    merci pietra
    par contre je ne veux pas de lazy = false car je n'ai pas tjs besoin de charger les classes liées

    plus concretement:

    g un produit qui a une liste de caractéristique et qui possede un état.
    g 3 fonctions:
    * Produit getProduit (int numP) qui me retourne le produit sans pouvoir accéder à la liste de Caractéristique (car g mis lazy=true)
    * getFicheProduit(int numP) qui me retourne le produit + la liste de carac + d'autres données (état, constructeur, notes, ...)
    * Produit getCaractéristique(Produit p) qui doit se charger de repeupler le produit avec la liste de caractéristique

    Le but est d'optimiser les requetes en fonction des besoins

    ex:
    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
     
     public dao2.Produit getProduitById(int numProduit) throws Exception {
            Session session = HibernateUtil.currentSession();
            Transaction tx = session.beginTransaction();
     
            dao2.Produit prod = (dao2.Produit) session.get(dao2.Produit.class, numProduit);
        // chargement des classes liées
            prod.getEtatP();
            prod.getConstructeur();
            prod.getCategorie();
            prod.getListCaract();
     
            tx.commit();
            HibernateUtil.closeSession();
            return prod;
        }
    et ca ne charge rien du tout!
    d'ailleurs quel est la différence entre get et load sous Hibzernate3 ( a part la levé d'exception / retourne null)???

    Ensuite quand ma couche de présentation accede au produit retourné, elle leve l'erreur de connexion close!

    DOnc mes questions sont:
    1- comment chargé réelement les classes liées avant de fermer la
    session
    2- comment peupler un objet détaché dans une autre session

    ==========> appliquer un filtre qui va reouvrir la session

    3 - différence entre get/load
    ==========>load et get font la meme chose sauf que si load ne trouve pas un objet il lance une exception alors qu'avec un get il retourne un null

    merci
    Moi j'ai eu le meme pb que toi concernant la gestion des session avec hibernate. j'ai donc utiliser une couche au dessus d'hibernate qui est spring qui me permet pas mal de pb en outre la gestion des session

    si tu as d'autres pb n'hesite pas

  7. #7
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Points : 130
    Points
    130
    Par défaut
    il me semble que Spring ne se contente que de gérer un SessionFactory en singleton? (mis a part les template,...)

    Quelle est la stratégie de gestion des sessions dans le cas d'une appli web?
    * une session par méthode de dao ?( ceque je fais actuelement puisque je ferme la session avecn de retourner)
    * une session par requete?
    * une session par sessionHttp (c risqué???)

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par mauvais_karma
    il me semble que Spring ne se contente que de gérer un SessionFactory en singleton? (mis a part les template,...)

    Quelle est la stratégie de gestion des sessions dans le cas d'une appli web?
    * une session par méthode de dao ?( ceque je fais actuelement puisque je ferme la session avecn de retourner)
    * une session par requete?
    * une session par sessionHttp (c risqué???)
    tu declare un filtre de session dans le fichier webXML
    <filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>ton url</url-pattern>
    </filter-mapping>
    <filter-mapping>
    le filtre te reouvre ta session

  9. #9
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Points : 130
    Points
    130
    Par défaut
    c la strategie session-per-request?
    http://www.hibernate.org/168.html

    mais dans un modele en couche, je ne peux pas récupérer cette session, sauf si je le passe en parametre a chaque méthode. Du coup on pert l'interet des couches

  10. #10
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 37
    Points
    37
    Par défaut
    tu n'a pas de classe utilitaire qui te permet de recuperer la session courante

  11. #11
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Points : 130
    Points
    130
    Par défaut
    si, j'utilise celle conseilée dasn la doc

    mais dans le cas présent, il faudrait récupérer un objet request de la servlet pour atteindre cette session

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par mauvais_karma
    si, j'utilise celle conseilée dasn la doc

    mais dans le cas présent, il faudrait récupérer un objet request de la servlet pour atteindre cette session
    dans la documentation c un singleton qui est utliser donc normalement tu peux recuperer ta session n'importe ou et a n'importe quel moment
    je vois pas le pb en fait et je vois le rapport avec la reponse :

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    Citation Envoyé par mauvais_karma
    si, j'utilise celle conseilée dasn la doc

    mais dans le cas présent, il faudrait récupérer un objet request de la servlet pour atteindre cette session
    Heu j espere que tu ne confonds pas la session Hibernate avec la session HTTP de HttpSession

    Sun Certified Business Component Developer
    Sun Certified Java Programmer
    --
    The definitive toolbox for GWT applications: gwt-toolbox
    My blog about Java and JEE: Benjamin's Blog

  14. #14
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Points : 130
    Points
    130
    Par défaut
    bon,
    le filtre spring se contente d'atacher a chaque requete un objet Session (Hibernate) pour une session HTTP, de l'ouvrir au début et de le fermer a la fin.

    dans ma dao je ne peux pas accéder à la session Http (et donc faire un sessionHttp.getAttribute("SessionHibernate") )

    ou alors g mal compris et ca s'utilise comme un beans de spring, g pas trouvé d'exemple d'utilisation...

    je vois pas le pb en fait et je vois le rapport avec la reponse Question
    en effet aucun rapport!

  15. #15
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 37
    Points
    37
    Par défaut
    en fait tu confond la session d'hibernate et la session HTTP qui sont strictement different

    est ce que tu utilise Spring .??
    normalement en utilisant spring tu n'a pas a gerer les session hibernate
    tu laisse spring s'en charger

  16. #16
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Points : 130
    Points
    130
    Par défaut
    je fais bien la différence entre les 2 mais dans mon esprit je pensais que le listener enregistre un objet HibernateSession dans un attribut de session HTTP ( c tout a fait possible)

    mais en lisant la doc g vu que cette session hibernate était en fait gérer ed facon classique avec spring via le des beans.

    g ouvert un autre sujet et je ferme celui ci
    merci

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

Discussions similaires

  1. MFC : comment créer dynamiquement des boutons?
    Par olator dans le forum Mobiles
    Réponses: 0
    Dernier message: 23/10/2008, 19h05
  2. [VB.Net] Comment créer dynamiquement un contrôle bouton ?
    Par robert.michel9 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 19/01/2006, 13h49
  3. Comment créer dynamiquement un alias BDE pour Access ?
    Par colorid dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/10/2005, 14h20
  4. Réponses: 6
    Dernier message: 24/10/2005, 08h43

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