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

Spring Java Discussion :

Standalone | Session in View


Sujet :

Spring Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 91
    Par défaut Standalone | Session in View
    Bonjour,

    Je travail sur une application Web qui integre struts, spring et hibernate.

    Nous avons donc une couche action (struts), une couche service (manager) et une couche Accès aux données (Dao).
    Afin de pouvoir profiter du "lazy" (par défaut dans hibernate 3), nous avons déclarer un filtre SessionInView dans le web.xml, qui permet si j'ai bien compris de garder la session hibernate durant la durée de la requete http.
    C'est a dire que dans mon action (classe action) je peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Personne personne = personneManager.getPersonneById(12); // (1 requete en bdd pour aller chercher la personne)
    // adresse n'est chargé qu'a la demande - lazy = true)
    Adresse adr =personne.getAdresse(); // (1 requete en bdd pour aller chercher l'adresse dans la table adresse)
    Tout fonctionne parfaitement.

    Mon problème arrive lorsque j'ai besoin de lancer une appli en version standalone, qui utilise les manager de mon appli Web.

    La ligne ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Personne personne = personneManager.getPersonneById(12); // (1 requete en bdd pour aller chercher la personne)
    System.out.println(personne.getNom());
    fonctionne parfaitement, elle m'affiche bien le nom de la personne qui a pour id 12.

    Parcontre , la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Adresse adr =personne.getAdresse();
    ne fonctionne pas , l'erreur Could not initialize proxy - no Session " apparait.

    En effet étant donner que je n'ai pas le filtre SessionInView, lors de cette appel, la session n'existe pas.
    Je comprend bien le problème, mais je ne sais pas comment y remédier.

    Si quelqu'un a quelques idees pour m'aider :-)

    merci et passé de bonnes fêtes.

    Loïc

  2. #2
    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
    C'est à toi d'initialiser dans ton manager, les données dont tu auras besoin dans tes couches supérieures :
    - soit par HQL, via fetch join
    - soit par Criteria, via fetch join
    - soit par Hibernate.initialize(tonObjet ou taCollection);

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 91
    Par défaut
    Merci de ta réponse fr1man,

    Mais une petite chose me dérange :

    Je ne peux pas connaitre a l'avance, de quoi les "clients" de mes managers auront besoin.

    Dans l'exemple que j'ai donné, je peux charger l'adresse avec fetch, ceci servira au client qui a besoin de l'adresse, mais pour les clients qui n'en ont pas besoin, l'adresse est chargé pour rien, dans ce cas le lazy n'as plus d'interet non ? (je parle d'un objet adresse , mais c'est vrai aussi pour les collections).
    Pour être sur de ne pas avoir de problème je devrais donc tout charger, c'est très lourd et du coup le lazy ne sert a rien ?

    Je trouve cela un peu déroutant ...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je n'ai pas de réponses à ta solution, mais je développe une application similaire (String, Spring MVC et Hibernate). Certaines fonctionnalités de l'application web devront surement être portées en Standalone.

    J'étais super intéresse par le lazy loading d'Hibernate mais voyant cette limitation du portage web standalone, j'ai laissé tombé la côté lazy. Si je vois que certaines choses sont vraiment trop lourde je placerais peut-être du "cache" au niveau des managers..

    En plus sa rend le couplage un peu plus fort entre les différentes couches et je veux éviter ça au maximum. Ou alors il faut peut-être coder le manager pour tester si il à accès à la session hibernate et réagir en fonction..

  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
    Effectivement, le lazy-loading perd de son intérêt hors utilisation "web".

    Tu peux dans ce cas, rédiger plusieurs versions de tes méthodes de "manager" selon les données que tu veux charger.
    Ce n'est pas génial mais je n'ai pas trouvé mieux pour l'instant.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 91
    Par défaut
    Bonjour à tous et merci pour vos réponses :-)

    En continuant mes recherches, je suis tombé sur cet article très intéressant, ainsi que tous les commentaires : http://www.jroller.com/kbaum/entry/o...ation_with_dao.

    J'ai donc essayé le code suivant :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    public static void main(String[] args) {
    try {
         // Fichiers de config
         String[] config = { "/WebContent/WEB-INF/applicationContext.xml",	"/WebContent/WEB-INF/applicationContext-hibernate.xml",	"/WebContent/WEB-INF/applicationContext-security.xml" };
     
         ApplicationContext context = new FileSystemXmlApplicationContext(config);
     
         SessionFactory sessionFactory = (SessionFactory) context.getBean("sessionFactory");
     
         Session session = SessionFactoryUtils.getSession(sessionFactory, true);
         SessionHolder holder = new SessionHolder(session);
         TransactionSynchronizationManager.bindResource(sessionFactory,holder);
     
         PersonneManager personneManager = (PersonneManager) (context.getBean("personneManager"));			 
         Personne pers = personneManager.getPersonneById(12);
         System.out.println(pers.getNom());
         Adresse adr =pers.getAdresse(); 
         System.out.println(adr.getNomRue());
     
         session.flush();		 
         TransactionSynchronizationManager.unbindResource(sessionFactory);
         SessionFactoryUtils.releaseSession(session, sessionFactory);
    } catch (BeansException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
    }
    }
    Ce code fonctionne parfaitement (y compris pour les insert, update et delete) et ne necessite aucun changement sur mon code existant, pourriez vous y jeter un coup d'oeil et me donner votre avis dessus .

    Merci d'avance

  7. #7
    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
    Effectivement, cela a l'air très intéressant.
    Je regarderai ça deplus près quand j'aurais plus de temps.

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/11/2010, 10h51
  2. Réponses: 0
    Dernier message: 07/10/2009, 17h31
  3. Réponses: 1
    Dernier message: 23/03/2009, 11h20
  4. [CakePHP] [CakePHP] Probleme de session avec view
    Par LoKiDemon dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 14/12/2007, 13h47
  5. [HIBERNATE] pattern Open Session in View
    Par _beber85 dans le forum Hibernate
    Réponses: 1
    Dernier message: 10/05/2006, 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