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 :

Supprimer dans une association ManyToMany


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut Supprimer dans une association ManyToMany
    Coucou ! C'est encore moi !

    Suite à l'aide efficace, notamment de tchize, j'ai maintenant le bon affichage quand l'étudiant qui se connecte est inscrit à un stage.

    Bonjour Test Test.

    Vous êtes inscrit au stage Histoire, du 2011-05-03 au 2011-05-20, dans l'établissement EPLEA Capou de Montauban (82).
    Sous ce texte d'accueil, à la place du bouton "Voir les stages", j'affiche un bouton "Me désinscrire" qui, comme son nom l'indique, doit effacer l'inscription de l'étudiant au stage, laquelle est physiquement enregistrée dans une table associative de ma BDD.

    Rappel du morceau de MCD concerné :
    ThStageStg -(1,1)----Etre----1,1- TeSessionSsn -0,n----Inscrire----0,n- ThCandidatCnd -(1,1)----Etre----0,1- ThUtilisateurUti

    J'ai donc créé une méthode desinscrire() dans AccueilEtudiant.java :
    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
        /**
         * desinscrire
         * Désinscrit l'étudiant de son stage
         * @return String retour à la page d'accueil de l'étudiant
         */
        public String desinscrire()
        {
            log.info("accueilEtudiant.desinscrire() ");
     
            // Instanciation du user en tant que candidat pour accéder à la session à laquelle est inscrit le candidat
            ThCandidatCnd candidat = (ThCandidatCnd) user;
            log.info("accueilEtudiant.desinscrire() - après instanciation candidat");
            stage.removeFromCandidat(candidat);
            log.info("accueilEtudiant.desinscrire() après remove");
            return "/AccueilEtudiant.xhtml";
        }
    => Celle-ci fait appel à la méthode removeFromCandidat de TeSessionSsn que j'ai écrite en suivant cet exemple du manuel de référence d'Hibernate, au chapitre 1.3.6.
    1.3.6. Travailler avec des liens bidirectionnels

    Premièrement, gardez à l'esprit qu'Hibernate n'affecte pas la sémantique normale de Java. Comment avons-nous créé un lien entre une Person et un Event dans l'exemple unidirectionnel ? Nous avons ajouté une instance de Event à la collection des références d'événement d'une instance de Person. Donc, évidemment, si vous voulons rendre ce lien bidirectionnel, nous devons faire la même chose de l'autre côté - ajouter une référence de Person à la collection d'un Event. Cette "configuration du lien des deux côtés" est absolument nécessaire et vous ne devriez jamais oublier de le faire.
    Beaucoup de développeurs programment de manière défensive et créent des méthodes de gestion de lien pour affecter correctement les deux côtés, par exemple dans Person :
    protected Set getEvents() {
    return events;
    }

    protected void setEvents(Set events) {
    this.events = events;
    }

    public void addToEvent(Event event) {
    this.getEvents().add(event);
    event.getParticipants().add(this);
    }

    public void removeFromEvent(Event event) {
    this.getEvents().remove(event);
    event.getParticipants().remove(this);
    }
    Voici la méthode que j'ai écrite dans TeSessionSsn dont hérite ThStageStg :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        /**
         * removeFromCandidat
         * Suppression d'une inscription d'un candidat à cette session
         * @param ThCandidatCnd candidat : le candidat dont il faut supprimer l'inscription à cette session
         */
        public void removeFromCandidat(ThCandidatCnd candidat)
        {
            this.getThCandidatCnds().remove(candidat);
            candidat.getTeSessionSsns().remove(this);
        }
    Sauf que j'ai un beau message d'erreur à l'exécution :
    16:49:23,638 INFO [AccueilEtudiant] accueilEtudiant.desinscrire()
    16:49:23,638 INFO [AccueilEtudiant] accueilEtudiant.desinscrire() - après instanciation candidat
    16:49:23,639 ERROR [LazyInitializationException] failed to lazily initialize a collection of role: org.domain.stamas.entity.TeSessionSsn.thCandidatCnds, no session or session was closed
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: org.domain.stamas.entity.TeSessionSsn.thCandidatCnds, no session or session was closed
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
    ...
    Cela veut-il dire qu'il faut que j'aille chercher la session de l'entityManager pour utiliser user et stage qui sont importés et dont pourtant je lis bien les propriétés dans la page AccueilEtudiant ?

    Pas après pas, j'y arriverai !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Deux jours plus tard... le boulet n'a pas avancé !

    Dans le message ci-dessus, j'instanciais user en tant que candidat et j'appelais la méthode removeFromCandidat de TeSessionSsn dont hérite ThStageStg.

    J'ai essayé d'instancier le stage en tant que session et d'appeler la méthode removeFromSession de ThCandidatCnd :
    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
        public String desinscrire()
        {
            try
            {
                log.info("accueilEtudiant.desinscrire() ");
     
                // Instanciation du user en tant que candidat pour accéder à la session à laquelle est inscrit le candidat
                ThCandidatCnd candidat = (ThCandidatCnd) user;
                log.info("accueilEtudiant.desinscrire() - après instanciation candidat");
     
                TeSessionSsn ses = (TeSessionSsn) stage;
     
                candidat.removeFromSession(ses);
                //candidat.getTeSessionSsns().remove(ses);
                //ses.getThCandidatCnds().remove(candidat);
                log.info("accueilEtudiant.desinscrire() après remove");
                entityManager.flush();
                log.info("accueilEtudiant.desinscrire() après flush");
                return "OK";
            }
    => J'ai le même genre d'erreur qui doit se produire durant l'exécution de la méthode :
    11:34:07,844 INFO [AccueilEtudiant] accueilEtudiant.desinscrire()
    11:34:07,844 INFO [AccueilEtudiant] accueilEtudiant.desinscrire() - après instanciation candidat
    11:34:07,845 ERROR [LazyInitializationException] failed to lazily initialize a collection of role: org.domain.stamas.entity.TeSessionSsn.thCandidatCnds, no session or session was closed
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: org.domain.stamas.entity.TeSessionSsn.thCandidatCnds, no session or session was closed
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
    J'ai aussi essayé de supprimer directement à partir de l'instance de candidat dans la méthode desinscrire :
    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
        public String desinscrire()
        {
            try
            {
                log.info("accueilEtudiant.desinscrire() ");
     
                // Instanciation du user en tant que candidat pour accéder à la session à laquelle est inscrit le candidat
                ThCandidatCnd candidat = (ThCandidatCnd) user;
                log.info("accueilEtudiant.desinscrire() - après instanciation candidat");
     
                TeSessionSsn ses = (TeSessionSsn) stage;
     
                //candidat.removeFromSession(ses);
                candidat.getTeSessionSsns().remove(ses);
                //ses.getThCandidatCnds().remove(candidat);
                log.info("accueilEtudiant.desinscrire() après remove");
                entityManager.flush();
                log.info("accueilEtudiant.desinscrire() après flush");
                return "OK";
            }
    => Cette fois je n'ai pas d'erreur mais la suppression ne se fait pas dans la BDD.
    11:42:43,301 INFO [AccueilEtudiant] accueilEtudiant.desinscrire()
    11:42:43,301 INFO [AccueilEtudiant] accueilEtudiant.desinscrire() - après instanciation candidat
    11:42:43,301 INFO [AccueilEtudiant] accueilEtudiant.desinscrire() après remove
    11:42:43,301 INFO [AccueilEtudiant] accueilEtudiant.desinscrire() après flush
    J'ai pensé que c'était parce qu'il manque la suppression inverse, présente dans la méthode removeFromCandidat ou removeFromSession et j'ai ajouté la suppression inverse :
    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
        public String desinscrire()
        {
            try
            {
                log.info("accueilEtudiant.desinscrire() ");
     
                // Instanciation du user en tant que candidat pour accéder à la session à laquelle est inscrit le candidat
                ThCandidatCnd candidat = (ThCandidatCnd) user;
                log.info("accueilEtudiant.desinscrire() - après instanciation candidat");
     
                TeSessionSsn ses = (TeSessionSsn) stage;
     
                //candidat.removeFromSession(ses);
                candidat.getTeSessionSsns().remove(ses);
                ses.getThCandidatCnds().remove(candidat);
                log.info("accueilEtudiant.desinscrire() après remove");
                entityManager.flush();
                log.info("accueilEtudiant.desinscrire() après flush");
                return "OK";
            }
    => Retour de l'erreur !
    11:48:01,944 INFO [AccueilEtudiant] accueilEtudiant.desinscrire() - après instanciation candidat
    11:48:01,945 ERROR [LazyInitializationException] failed to lazily initialize a collection of role: org.domain.stamas.entity.TeSessionSsn.thCandidatCnds, no session or session was closed
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: org.domain.stamas.entity.TeSessionSsn.thCandidatCnds, no session or session was closed
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
    Quelqu'un pour m'aider ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    J'en ai eu marre ! Je suis passé par une nativeQuery et ça marche ! Et ça ne m'a pris que 5 mn à écrire et à tester !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                Query q = entityManager.createNativeQuery(
                    "DELETE FROM tj_cnd_inscrire_ssn_cis " +
                    "WHERE cis_id_candidat = :idcandidat " +
                        "AND cis_id_session = :idsession ");
                q.setParameter("idcandidat", user.getPrsId());
                q.setParameter("idsession", stage.getSsnId());
     
                q.executeUpdate();
    Plus ça va, plus je dis que Hibernate est inutilement compliqué !

    N'empêche que si quelqu'un a une explication claire à me donner sur le pourquoi du comment que la précédente méthode engendrait une erreur, il est le bienvenu.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    l'explication claire est dans le message:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    failed to lazily initialize a collection of role: org.domain.stamas.entity.TeSessionSsn.thCandidatCnds no session or session was closed
    La session associée à ton objet n'est plus active (closed), il est donc devenu impossible de faire la moindre manipulation lazy. La session étant fermée, plus de pont avec la db, etc Tu as maintenant un simple POJO détaché de la DB.

    Maintenant la question à savoir c'est pourquoi tu as fermé ta session avant de finir le travail En hibernate, on travaille toujours en gros de la même manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    session = ...créer session....
    get,manipulations, appels à session.saveOrUpdate(), etc
    session.close();
    // a partir de là on ne fais plus rien avec les objets

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Et si tu est obligé de travailler avec deux sessions différentes (exemple tu récupère user/stage dans une requete, tu veux les manipuler dans une autre requetes http), utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                ThCandidatCnd candidat = (ThCandidatCnd) user;
    entitymanager.merge(candidat); // candidata maintenant associé à cet entitymanager
                log.info("accueilEtudiant.desinscrire() - après instanciation candidat");
     
                TeSessionSsn ses = (TeSessionSsn) stage;
    entitymanager.merge(stage)
                //candidat.removeFromSession(ses);
                candidat.getTeSessionSsns().remove(ses);

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    J'avais à peu près compris le sens du message et mes recherches à son sujet me faisait poser la même question :
    pourquoi tu as fermé ta session avant de finir le travail
    Sauf que je n'ai rien fait chef ! C'est Seam qui se débrouille tout seul avec ça !
    Il affiche la page avec les bonnes informations issues des objets user et stage importés depuis Authenticate.java / login.xhtml puis ferme tout.
    Je pensais qu'en instanciant les objets, comme tu m'as appris à le faire dans l'autre discussion, je récupérerais la maîtrise complète des propriétés et des méthodes de ces objets mais apparemment ce n'est pas comme ça que ça fonctionne dans le monde Seam.

    Il y a encore un paquet de trucs qui m'échappent dans cette usine à gaz !

    Bon maintenant faut que je trouve comment actualiser la page pour qu'il prenne en compte la nouvelle situation de l'étudiant !

    Au problème suivant donc...
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    seam applique une recommandation de hibernate en mode web: une session / requete HTTP. Donc forcément, une fois le rendu fait, la session est cloturée. On va pas la garder ouvert, ce truc bouffe des ressources. Comme je l'ai montrer, faut réattacher tes objet si tu veux réutiliser des objets entre les requetes http. D'ailleurs, en général, il vaux mieux être prudent quand on stocke des objets hibernate dans la session, ca pose pas mal de problèmes, ne serait-ce que celui du comportement quand ces objets sont manipulés en parallèle par plusieurs requetes http simultanées (la session hibernate n'étant pas multi threadée)

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je viens d'essayer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                ThCandidatCnd candidat = (ThCandidatCnd) user;
                entityManager.merge(candidat);
                TeSessionSsn ses = (TeSessionSsn) stage;
                entityManager.merge(ses);
                log.info("accueilEtudiant.desinscrire() - après instanciations");
     
     
                candidat.removeFromSession(ses);
    Erreur :
    14:35:56,998 DEBUG [Loader] result set contains (possibly empty) collection: [org.domain.stamas.entity.ThCandidatCnd.teSessionSsns#2]
    14:35:56,998 DEBUG [Loader] result row: EntityKey[org.domain.stamas.entity.TeSessionSsn#2]
    14:35:56,999 DEBUG [Loader] found row of collection: [org.domain.stamas.entity.ThCandidatCnd.teSessionSsns#2]
    14:35:56,999 DEBUG [AbstractBatcher] about to close ResultSet (open ResultSets: 1, globally: 1)
    14:35:56,999 DEBUG [AbstractBatcher] about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
    14:35:56,999 DEBUG [TwoPhaseLoad] resolving associations for [org.domain.stamas.entity.ThStageStg#2]
    14:35:56,999 DEBUG [TwoPhaseLoad] done materializing entity [org.domain.stamas.entity.ThStageStg#2]
    14:35:57,000 DEBUG [CollectionLoadContext] 1 collections were found in result set for role: org.domain.stamas.entity.ThCandidatCnd.teSessionSsns
    14:35:57,000 DEBUG [CollectionLoadContext] collection fully initialized: [org.domain.stamas.entity.ThCandidatCnd.teSessionSsns#2]
    14:35:57,000 DEBUG [CollectionLoadContext] 1 collections initialized for role: org.domain.stamas.entity.ThCandidatCnd.teSessionSsns
    14:35:57,000 DEBUG [StatefulPersistenceContext] initializing non-lazy collections
    14:35:57,000 DEBUG [Loader] done loading collection
    14:35:57,001 INFO [AccueilEtudiant] accueilEtudiant.desinscrire() - après instanciations
    14:35:57,001 ERROR [LazyInitializationException] failed to lazily initialize a collection of role: org.domain.stamas.entity.TeSessionSsn.thCandidatCnds, no session or session was closed
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: org.domain.stamas.entity.TeSessionSsn.thCandidatCnds, no session or session was closed
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
    ...
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. [C#] Supprimer dans une listView
    Par thomfort dans le forum Windows Forms
    Réponses: 13
    Dernier message: 03/10/2006, 10h55
  2. forme juridique pour des prestations dans une association
    Par guigui5931 dans le forum Association
    Réponses: 8
    Dernier message: 15/07/2006, 15h46
  3. Compter le nombre d'enregistrement supprimer dans une jsp
    Par DarkWark dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 26/05/2006, 11h36
  4. Réponses: 2
    Dernier message: 12/05/2006, 12h00
  5. Réponses: 4
    Dernier message: 04/04/2006, 16h09

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