EJB, client swing, LazyInitializationException
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:
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:
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:
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:
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