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 :

Déroulement des étapes hibernate


Sujet :

Hibernate Java

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 391
    Points : 185
    Points
    185
    Par défaut Déroulement des étapes hibernate
    Bonjour à tous ,

    j'essaie de récupérer une donnée grâce à son id dans une BDD MySql mais une l'Exception suivante survient (de temps en temps, ça passe parfois en debug sans que je ne change rien) :

    Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:147)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:260)
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:68)
    at com.ecollection.model.Mdp_$$_jvst588_0.getMdp(Mdp_$$_jvst588_0.java)
    at TestMain.main(TestMain.java:114)
    Comme je l'ai dit au dessus, parfois ça passe quand je fais du "pas-à-pas" en mode debug. Je soupçonne donc une erreur de synchronisation dans mes étapes d'ouverture/fermeture de Session/Factory Hibernate. J'espère que vous pourrez m'aider.

    Liste des étapes :

    1/ Mon main appel le service MdpServiceImpl pour récupérer un mot de passe et l'afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MdpServiceImpl impl = new MdpServiceImpl();
    Mdp mdp = impl.recupererMdp(new Utilisateur());	   
    System.out.println(mdp.getMdp());
    2/ Mon MdpServiceImpl ouvre le context Spring, puis fais appel à une MdpDao pour récupérer la donnée :

    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
     
    ClassPathXmlApplicationContext context;
    MdpDao mdpDao;
     
    public Mdp recupererMdp(Utilisateur utilisateur) {
    	demarrerContext();
     
    	Mdp res = mdpDao.recupererMdp(utilisateur);
     
    	fermerContext();
     
    	return res;
    }
     
    public void demarrerContext() {
    	context = new ClassPathXmlApplicationContext("spring.xml");
    	mdpDao = context.getBean(MdpDao.class);
    }
     
    public void fermerContext() {
    	context.close(); 
    }
    3/ La MdpDao ouvre la Session, récupère l'objet Mdp, referme la session et renvoi le Mdp au Service qui l'a appelé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private SessionFactory sessionFactory;
     
    public void setSessionFactory(SessionFactory sessionFactory) {
    	this.sessionFactory = sessionFactory;
    }
     
    public Mdp recupererMdp(Utilisateur utilisateur) {
    	Session session = sessionFactory.openSession();
    	Mdp res = session.load(Mdp.class, new Long("1"));
    	session.close();
    	return res;
    }
    4/ Le Service (voir code en 2/) récupère le Mdp depuis la Dao puis ferme le context et renvoie le Mdp à mon main

    5/ Mon main affiche Mdp.

    Voilà, je pense faire une erreur dans les ouvertures/fermetures de Sessions/Factory mais je ne saisi pas pourquoi.

    Merci d'avance à ceux qui prendront le temps de me lire et me répondre .

  2. #2
    Membre confirmé Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Points : 566
    Points
    566
    Par défaut
    slt,
    as tu essayé avec sessionFactory.getCurrentSession()?

    ++
    "Aucun de nous ne sait ce que nous savons tous, ensemble."
    Lien vers mon appli Funcash n'hésitez pas à donner votre avis

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 391
    Points : 185
    Points
    185
    Par défaut
    Salut. Je viens d'essayer et ça ne change rien.
    Je viens de remarquer quelque chose.

    Si j'ajoute un SYSO dans ma class DAO, l'erreur ne survient pas (même dans le main à la fin).

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tout ce qui est configuré en Lazy dans ton objet est chargé 'à la demande'. Mais ce chargement ne peux se faire que tant que la session est ouverte. Pour le moment ton code a cette forme.


    1. creer session
    2. recuperer objet
    3. fermer session
    4. manipuler objet



    L'ordre correct pour que le lazy fonctionne est

    1. creer session
    2. recuperer objet
    3. manipuler objet
    4. fermer session




    autrement dit ta gestion de session doit sortir de ton dao. Si ça marche en debug / avec des sysout, c'est que le lazy ne s'initialise que la première fois, et dans les deux cas tu fais le premier appel avec une session ouverte, donc pas de soucis.

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 391
    Points : 185
    Points
    185
    Par défaut
    Bien reçu. Un grand merci =D.

    Finalement je suis passé à une gestion avec @Transactional de Spring mais j'aurais aimé ne pas le faire donc je vais réessayer en full-hibernate avec ta solution. Merci =D.

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

Discussions similaires

  1. Je Cherche des Tutoriels Hibernate avec Struts et Spring
    Par Incinerator dans le forum Spring
    Réponses: 4
    Dernier message: 26/09/2008, 15h27
  2. Réponses: 1
    Dernier message: 31/01/2008, 09h08
  3. ordre des déroulement des instructions
    Par phlapier dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/07/2007, 15h50
  4. Sauter des étapes dans un Wizard
    Par maXrez dans le forum ASP.NET
    Réponses: 2
    Dernier message: 27/04/2007, 10h07
  5. [Hibernate][Struts] Fermeture des session hibernate
    Par osopardo dans le forum Hibernate
    Réponses: 2
    Dernier message: 22/08/2005, 17h30

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