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
- EJB entité
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; }
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 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; } }
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
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 ... }
Merci d'avance
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; }
Cédric Templie
Partager