Bonjour,

Voici ma configuration:
Serveur d'application: JBoss 4.2
DB : MySql 5.0.22

Je deploye des EJBs session sur le serveur JBoss, et j'utilise un client swing pour attaquer le serveur.

Mon EJB session fourni une méthode qui retourne une liste d'entités. Après la récupération de la liste dans le client, quand je veux récupérer des éléments de mon entité (une collection lazily fetched), j'ai l'exception suivante:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: no session or session was closed

J'ai bien compris que l'erreur est du au fait que la session n'est pas conservée dans le client. Mon problème est que je ne sais pas comment récupérer la session dans le client swing.

Voici le code du coté serveur:

- EJB Session
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
public Collection<Person> findPersons()
	{
 
		// The query used to find persons
		Query findPerson = entityManager.createNamedQuery( "findPersons" );
 
		// Get the list of persons
		Collection<Person> persons = findPerson.getResultList();
 
		return persons;
	}
- EJB entité
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
public class Person implements Serializable
{
	/**
         * 
         */
	@ManyToMany
	public Collection<Document> documents;
 
       /**
         * @return the documents
         */
	public Collection<Document> getDocuments()
	{
		return documents;
	}
 
	/**
         * @param documents
         *            the documents to set
         */
	public void setDocuments( Collection<Document> documents )
	{
		this.documents = documents;
	}
}
Le client swing:

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
 
public class MyPanel implements ActionListener
{
	/**
         * 
         */
	private List<Person> persons;
 
       /**
         * 
         */
	private void searchPerson()
	{
		try
		{
			// Get the context
			Context context = InitialContext.getInitialContext();
			SessionBean sessionBean = (SessionBean ) context.lookup( "SessionBean/remote" );
 
			// Get the list of modification request
			Collection<Person> personsCollection = sessionBean .findPersons();
 
                        // Clear the list of person
			persons.clear();
 
			Iterator iterator = personsCollection.iterator();
			while ( iterator.hasNext() )
			{
				// Get the person
				Person person = (Person) iterator.next();
 
				persons.add( person );
                         }
                 }
                 ...
         }
 
         /**
          * Method called when user select update button
          */
         public update()
         {
                ...
		// Retrieve the person
 
		// Get the list of documents
		Collection<Document> documents = person.getDocuments();
                --> Exception here
 
                ...
         }
J'ai quand même trouvé une solution qui ne me plait pas du tout, mais me permet de résoudre mon problème, dans l'EJB Session:

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
 
	public Collection<Person> findPersons()
	{
 
		// The query used to find persons
		Query findPerson = entityManager.createNamedQuery( "findPersons" );
 
		// Get the list of persons
		Collection<Person> persons = findPerson.getResultList();
 
		// TODO: Fix this dirty hack
		// This hack eagerly fetch the collections embedded by a person
		Iterator<Person> personsIterator = persons.iterator();
		while ( personsIterator.hasNext() )
		{
			Person person = personsIterator.next();
			person.getDocuments().size();
		}
 
		return persons;
	}
Merci d'avance

Cédric Templie