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 .