Bonjour à tous,

je suis entrain de développer une application web (applet - servlet), et j'utilise aussi des EJB3 avec des entity bean. Le but de mon appli et de pouvoir ajouter, supprimer et faire des requêtes select dans ma base de données.

Mais voila, j'ai un problème qui est lorsque je veux ajouter un élément dans ma base de données j'ai cette erreur :

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
 
type Rapport d'exception
 
message
 
description Le serveur a rencontré une erreur interne () qui l'a empêché de satisfaire la requête.
 
exception
 
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ejb.TypeDocument.document, no session or session was closed
	org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
	org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
	org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
	org.hibernate.collection.PersistentSet.add(PersistentSet.java:189)
	servlet.AjouterDocument.doGet(AjouterDocument.java:153)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
 
note La trace complète de la cause mère de cette erreur est disponible dans les fichiers journaux de JBossWeb/2.0.0.GA.
D'aprés ce que j'ai lu et d'aprés ce que m'as dis djo.mos, car j'ai mis ce post aussi sur le forum JPA mais malheureusement j'ai toujours le problème , il faut rattacher les objets mais je n'arrive à comprendre comment faire cela, ou ouvrir une session hibernate mais pour tout vous dire ces notions sont assez sombres pour moi.

Pourriez vous m'expliquez pourquoi j'ai cette erreur de lazyInitializationException ?
J'ai une idée car si je fais une requête de type select et que mon objet retournée posséde une collection, cette collection est vide mais je n'arrive pas à comprendre pourquoi ?

Pourriez vous me dire comment je peux résoudre ce problème

Merci

PS : Je ne sais pas si mes explications sont trés claires mais dans ma tête toutes ces notions de session, de rattacher des objets... ne sont pas trés claires

Je vous mais au cas où mes fichiers qui peuvent peut-être vous intéresser :

GestionDeDocumentBean.java

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
 
@Stateless
public class GestionDeDocumentBean implements GestionDeDocument{
 
	@PersistenceContext
	EntityManager em;
 
 
	public List<Document> AfficherDocumentCommercial() {
 
		return null;
	}
 
	public List<Document> AfficherDocumentTechnique() {
 
		return null;
	}
 
	public List<Document> RechercherDocument(Document document, Tag tag) {
 
		return null;
	}
 
	public void ajouterDocument(Document document) {
		em.merge(document);
		//em.persist(document);
	}
 
	public void supprimerDocument(Document document) {
		//em.merge(document);
		em.remove(em.find(Document.class, document.getId()));
 
	}
 
	public void ajouterTag(Tag tag) {
		em.merge(tag);
		//em.persist(tag);
 
	}
 
	public void ajouterType(TypeDocument type) {
		em.merge(type);
		//em.persist(type);
 
	}
 
	public void ajouterModification(Modification modification) {
		em.merge(modification);
		//em.persist(modification);
 
	}
 
	public void ajouterUser(Utilisateur user) {
		em.merge(user);
		//em.persist(user);
 
	}
 
 
	public Document recupereDocument(String nom) {
		Query q = em.createQuery("select d from Document d where d.nom = :nom");  
 
		q.setParameter("nom",nom);  
 
		Document d = (Document) q.getSingleResult();  
 
		return d;  
	}
 
	public TypeDocument recupereType(String nom){
		try{
 
				Query q = em.createQuery("select t from TypeDocument t where t.nom = :nom");  
 
				q.setParameter("nom",nom);  
 
				TypeDocument t = (TypeDocument) q.getSingleResult();  
 
				return t;
		}
		catch(NoResultException e){
			return null;
		}
 
	}
 
	public Tag recupereTag(String nom){
		try{
 
			Query q = em.createQuery("select t from Tag t where t.nom = :nom");  
 
			q.setParameter("nom",nom);  
 
			Tag t = (Tag) q.getSingleResult();  
 
			return t;
	}
	catch(NoResultException e){
		return null;
	}
	}
 
}
et ma servelt dans laquelle j'appelle ces fonctions :

AjouterDocument.java : (enfin la partie qui pose problème)

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
TypeDocument td= gdd.recupereType(leType);
// si le type n'existe pas alors on cré un nouveau typz
if(td==null){
	type = new TypeDocument();
	type.setNom(leType);
	type.setCommentaire("");
	type.getDocument().add(document);
	document.setTypeDocument(type);
	gdd.ajouterType(type);
}
else{// si le type existe donc on ajoute au type le nouveau document
	type=td;
	document.setTypeDocument(type); 
	type.getDocument().add(document); // voila où il y a l'erreur
	gdd.ajouterDocument(document);
}