IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

EJB, client swing, LazyInitializationException


Sujet :

JPA Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut 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 : 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

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Tu n'as pas beaucoup de solutions.
    Ta couche de persistance se trouve sur ton serveur, c'est donc à elle de te renvoyer des objets dont les collections sont initialisées.
    Tu peux donc modifier ta requête pour qu'elle initialise tes collections via un fetch join.
    Un fetch join est conseillé par requête de manière à ne pas remonter tout le schéma de la base en une fois.

Discussions similaires

  1. Client Swing pour un EJB
    Par mysianne dans le forum Java EE
    Réponses: 2
    Dernier message: 04/04/2013, 15h45
  2. [EJB3.1] Comment appeler des EJB depuis un client Swing
    Par levolutionniste dans le forum Java EE
    Réponses: 2
    Dernier message: 25/03/2012, 20h49
  3. [EJB] Pour un client Swing, EJB ou WebServices?
    Par saveriu dans le forum Java EE
    Réponses: 2
    Dernier message: 13/01/2010, 09h13
  4. [EJB] communication client swing/serveur ejb
    Par afrikha dans le forum Java EE
    Réponses: 10
    Dernier message: 24/06/2008, 14h45
  5. client Swing
    Par F Barbier dans le forum Glassfish et Payara
    Réponses: 11
    Dernier message: 02/03/2007, 11h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo