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

Hibernate Java Discussion :

Comment detacher un objet ?


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 29
    Par défaut Comment detacher un objet ?
    Bonjour,

    Comment peut on détacher totalement un objet d'hibernate ?
    J'ai une erreur dans mon programme :
    org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed

    En fait apres fermeture de la session je fais un get sur un attribut pour tester qu'il n'a pas chargé la relation many-to-one, et là c'est l'erreur...

    peut-on sortir coupé ce lien avec hibernate ?

    merci

  2. #2
    Membre confirmé Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Par défaut
    En fait apres fermeture de la session je fais un get sur un attribut pour tester qu'il n'a pas chargé la relation many-to-one, et là c'est l'erreur...
    LazyInitializationException montre que ta collection d'objet (relation many-to-one) n'a effectivement pas été chargée.

    C'est bien ce que tu voulais vérifier !

    Si tu veux que ce soit le cas, il faut mettre lazy à false ou refaire une requête "manuelle".

  3. #3
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Par défaut
    En fait je comprend ta question. tu voudrais pouvoir savoir si une methode a deja ete appele lorsque tu etais dans la session afin d'eviter le lazylooadingexception.

    J'etais confronte a ce probleme lorsque j'écrivais un petit générateur de code pour hibernate.

    Tu peux ecrire une simple methode de la facon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public boolean estInvoquee(){
      try{
           taclasse.getMethode();
          return true;
      }catch(Exception e){
        return false;
     }
    }
    Ainsi si la methode genere une erreur tu la recupere et tu saura si elle etait appelle ou non. c'est l'idee que je te donne. tu peux la modifier a ta guise.
    Mainteant si tu veux faire du générique (Ne pas avoir a ecrire une methode de test pour chaque methode de classe), tu peux regarder au niveau de common-bean-utils de jakarta. C'est une bonne implémentation de l'intropesction

    Quant a moi j'ai code cette classe
    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
     
    package oued.ressources;
     
    import java.lang.reflect.InvocationTargetException;
    import java.util.List;
    import java.util.Set;
     
     
    import org.apache.commons.beanutils.PropertyUtils;
     
    import oued.ressources.TransactionManager;
     
    /**
     * Cette classe a pour but d'invoquer sur un objet une méthode en
     * chaine de caractère qu'on lui à passé
     * @author ouedmouss
     * @since 25-04-2007
     *
     */
    public class Introspecteur {
    	/**
             * L'objet sur lequel on veut invoquer l'appel des méthodes
             */
    	private Object objet;
     
    	public Introspecteur(Object objet){
    		this.objet=objet;
    	}
     
    	/**
             * Cette methode permet d'invoquer sur l'objet la méthode passée en paramètre
             * @param nomPropriete le nom de la méthode que l'on veut exécuter
             * @return un objet qui correspond à l'exécution de la méthode
             */
    	public Object invoquerGetter(String nomPropriete){
    		try {
    			return PropertyUtils.getSimpleProperty(objet, nomPropriete);
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		} catch (InvocationTargetException e) {
    			e.printStackTrace();
    		} catch (NoSuchMethodException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
     
    }
    Cette classe a besoin de la librairie common-bean-utils de jakarta (se trouve sur leur site).

    Je l'utiliser de la facon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      Etudiant etudiant=new Etudiant();
       Introspecteur introspecteur=new Introspecteur(etudiant);
       List liste=(List)introspecteur.invoquerGetter("listeNote"); //listeNote est une attribut d'Etudiant
    J'espère que tu pourras faire ton choix dans toutes ces solutions

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 29
    Par défaut
    Merci beaucoup pour ces informations, je pense que je vais appliquer l'Introspecteur pour mon problème.

    C'est quand même dommage qu'on ne puisse pas coupé ce lien avec hibernate, je ne comprend pas pourquoi il peut encore appeler le proxy hibernate apres la fermeture de la session. Meme la methode evct(Object) ne fonctionne pas.

Discussions similaires

  1. [VS.NET] Comment enregistrer un objet COM
    Par Dnx dans le forum Visual Studio
    Réponses: 5
    Dernier message: 24/03/2005, 22h38
  2. [JACOB] Comment passer un objet par référence à une méthode
    Par zlavock dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 21/03/2005, 18h28
  3. [servlet][bean]comment récupérer l'objet request
    Par otminou dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 27/09/2004, 14h40
  4. Comment mettre plusieurs objets ds un composant ?
    Par Fleury dans le forum Composants VCL
    Réponses: 7
    Dernier message: 24/05/2003, 17h34

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