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 :

Removing a detached instance ?


Sujet :

Hibernate Java

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 136
    Par défaut Removing a detached instance ?
    Bonjour

    je boss sur une appli. hibernate + jsf, quand je click sur un lien de supression d'un objet avec une methode : removeObject(monObject)

    j'ai cette erreur :

    java.lang.IllegalArgumentException: Removing a detached instance

    est ce que ça vous dis quelque chose ????

    merci

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Essaie de réattacher ton objet à une session hibernate avant de le supprimer.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 136
    Par défaut
    Bonjour

    comment faire pour réattacher mon objet à une session ??

    je débute dans tous ça

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    session.refreh(myObject) devrait suffire

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 136
    Par défaut
    refreh(myObject) m'envoi cette erreur :

    java.lang.IllegalArgumentException: Entity not managed

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 75
    Par défaut
    Citation Envoyé par eric95
    refreh(myObject) m'envoi cette erreur :

    java.lang.IllegalArgumentException: Entity not managed
    Il faut donc soit que tu debrouille pour garder ton objet Session de hibernate (ton entity est rattaché à une session, le refresh peut marcher (mais je crois qu'il peut supprimer tes modifs) si tu as encore ta session)

    Si tu ne peut conserver ta session cela devient galere, il faut charger une nouvelle instance de ton objet puis la mettre à jour (en modifiant les valeurs avec ton objet qui vient de ton client) puis enfin faire un update (hibernate) sur ta nouvelle instance. Je ne vois malheureusement pas d'autre solution mais je me trompe peut être.

    Louis

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 136
    Par défaut
    ce que je voulais c'est le supprimé pas le modifié , et le fait de l'appeler une deuxiéme fois pour le supprimer ne changera rien

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 75
    Par défaut
    Citation Envoyé par eric95
    ce que je voulais c'est le supprimé pas le modifié
    je ne dois pas êtrte bien réveiller
    Citation Envoyé par eric95
    le fait de l'appeler une deuxiéme fois pour le supprimer ne changera rien
    Je ne vois pas pourquoi, tu la charge de nouveau (avec un find ou quelque chose dans le genre, avec les EJB3 je ne sais plus), puis tu fait ton remove sur l'objet que tu viens de recuperer.

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 136
    Par défaut
    ouiii en appelant une feuxieme fois avec find, ça marche


    merciii

  10. #10
    Invité de passage
    Inscrit en
    Octobre 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 2
    Par défaut Pour rattacher un objet Hibernate
    Bonjour,

    Pour rattacher une instance détachée, il faut utiliser session.Lock(instance,LockMode.READ).

    La fonction refresh se charge juste de "resynchronizer" l'instance d'un objet persistent avec la base (une instance déjà chargée).

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 10
    Par défaut
    Citation Envoyé par eric95 Voir le message
    ouiii en appelant une feuxieme fois avec find, ça marche

    Avec find tu génère du traffic vers la base de données inutilement.

    Essaye merge

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Par défaut
    Pour ce qui est d'utiliser merge, ne te fais pas piéger comme moi.


    La méthode merge() retourne un nouvel objet dans le l'état "managed".

    Faire quelque chose dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    delete(user) {
     
    em.merge(user);
    em.remove(user);
    }
    te donnera toujours la même exception, car la référence n'est pas mise à jour, tu appelles donc toujours remove sur l'objet dans l'état "detached".

    Donc deux solutions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    delete(user) {
     
    user = em.merge(user);
    em.remove(user);
    }
    ou directement :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    delete(user) {
     
    em.remove(em.merge(user));
    }
    bonne chance pour la suite.

  13. #13
    Membre averti
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Juillet 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Finlande

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Juillet 2009
    Messages : 13
    Par défaut
    Il est aussi possible d'utiliser l'annotation @Transactionnal sur la plus haute fonction. Tout ce qui sera fait dans cette dernière sera dans la même session hibernate.
    De plus, si jamais une erreur survenait, un roll-back sera effectué.

  14. #14
    Membre très actif Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Par défaut
    Citation Envoyé par lookthat Voir le message
    Il est aussi possible d'utiliser l'annotation @Transactionnal sur la plus haute fonction. Tout ce qui sera fait dans cette dernière sera dans la même session hibernate.
    De plus, si jamais une erreur survenait, un roll-back sera effectué.
    salut
    essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void suppressionEmploye(int employeId) 
    {
                Employe emp = em.find(Employe.class, employeId);
              if (emp != null) 
              {
                    em.remove(emp);
             }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/06/2009, 23h54
  2. JPA - JUnit - em.remove : detached
    Par usmok dans le forum JPA
    Réponses: 1
    Dernier message: 24/04/2009, 15h27
  3. Removing a detached instance
    Par Chatastroff dans le forum JPA
    Réponses: 3
    Dernier message: 17/12/2008, 10h22
  4. Réponses: 1
    Dernier message: 12/07/2007, 15h35
  5. [] plusieurs instances de form avec leur contexte ?
    Par Seb-31 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 11/04/2003, 13h56

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