Bonjour !

J'ai un problème avec l'intégration d'hibernate dans spring.
J'utilise Spring en tant qu'IOC, AOP mais surtout Template pour hibernate (ce qui pose problème ici).
Petite explication préliminaire du logiciel :
J’ai 2 entity : User et Message, un User a un certain nombre de message envoyé et un certain nombre de message reçu.
En effet lorsque je fais une récupération de données via un DAO CRUD classique de Spring la session est fermée dès que l'opération est finie…
Et si je veux accéder a d’autre entity lié par une relation OneToMany par exemple et bien j’ai l’erreur "classique" :

GRAVE: failed to lazily initialize a collection of role: hermes.model.dao.entities.User.sendedMessages, no session or session was closed

Apres pas mal de recherche j’ai compris que ca venais du "Lazy" utilisé par hibernate qui permet de récupérer des données en relation "plus tard" mais seulement quand la session est encore ouverte !

Dans ces recherches j’ai trouvé 3 solutions :

- Mettre lazy à off : Hors de question pour des raisons évidente de performances.
- Mettre des lignes supplémentaires dans le Web.xml pour "binder" un servlet a une session : Helas je ne l’utilise pas dans un servlet, donc il faut que je trouve autre chose.
- Créer des fonctions spécifique (ie je leur dit que je veux récupérer les entity lié a la récupération du premier entity) dans mon DAO CRUD qui vont exécuter un MonEntity.getMaListDAutreEntity().size() : Je trouve ça très crade et en plus je comprends pas mais cela ne marche pas mieux…

Bref si vous avez des solutions ? Je vous en remercierai beaucoup !

Je vous joins un peu de source :

DAO avec size :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
	public User getUser(int id) {
		User user = (User)getHibernateTemplate().get(User.class, id);
		user.getReceiptedMessages().size();
		user.getSendedMessages().size();
		return user;
	}
DAO sans size :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
	public User getUser(int id) {
		User user = (User)getHibernateTemplate().get(User.class, id);		return user;
	}
Code client :

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
		BeanFactory factory = SpringBeanFactory.getBeanFactory();
		DAOUserImpl daoUser = (DAOUserImpl)factory.getBean("daoUser");
		DAOMessageImpl daoMsg = (DAOMessageImpl)factory.getBean("daoMessage");
 
		User u1 = daoUser.getUser(1);
		User u2 = daoUser.getUser(2);
 
		Message msg = new Message();
		msg.setContents("Salut ca boom ?");
		msg.setTitle("Yo");
		msg.setSender(u1);
		msg.setRecepient(u2);
 
		daoMsg.saveMessage(msg);
 
		User user = daoUser.getUser(1); 
 
		Set<Message> messages = user.getSendedMessages();
		for (Message message : messages) //l’erreur est ici
			System.out.println(message.getContents());
Merci