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

Spring Java Discussion :

Spring - Hibernate => Transactions


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 32
    Par défaut Spring - Hibernate => Transactions
    Bonjour,

    Je débute avec Spring 3.1.1/Hibernate 4.1.0/Struts 2.2.3.
    Tout a l'air de bien fonctionner sauf que mes transactions (si elle se lance bien?) ne sont en fait jamais commité dans ma base de données. L'insertion d'une ressource ce passe bien aucun erreur, mais l'enregistrement en base ne se fait pas.

    Voici mon applicationContext :
    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
     
    <?xml version="1.0" encoding="ISO-8859-15"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
           http://www.springframework.org/schema/context 
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
     
      <!-- Import de la config hibernate/dao depuis le ccr-core -->
      <import resource="classpath:applicationContext-ccr-hibernate.xml"/>
     
     
      <!-- Activation des annotations -->
      <context:component-scan base-package="fr.cndp.ccr.core.dao"/>      
      <context:component-scan base-package="fr.cndp.ccr.core.service"/>    
     
    </beans>
    Mon applicationContext-ccr-hibernate.xml (qui se trouve dans un sous-module) :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    <?xml version="1.0" encoding="ISO-8859-15"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
           http://www.springframework.org/schema/context 
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
     
      <bean id="dataSourceCCR"
         class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://javadev.cndp.lan:3306/ccrdb" />
        <!--<property name="url" value="jdbc:mysql://localhost:3306/ccrdb" />-->
     
        <property name="username" value="db" />
        <property name="password" value="toto" />
      </bean>
     
      <bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
        <property name="dataSource" ref="dataSourceCCR" />
        <property name="mappingLocations">
          <value>classpath*:fr/cndp/ccr/core/modele/*.hbm.xml</value>
        </property>
        <property name="hibernateProperties">
          <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.id.new_generator_mappings">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.validator.apply_to_ddl">false</prop>  
            <prop key="hibernate.connection.release_mode">after_transaction</prop>
            <!--<prop key="current_session_context_class">thread</prop>-->
            <prop key="hibernate.validator.autoregister_listeners">false</prop>  
            <prop key="c3p0.acquire_increment">1</prop> 
            <prop key="c3p0.min_size">1</prop>
            <prop key="c3p0.max_size">20</prop>
            <prop key="c3p0.timeout">0</prop>
            <prop key="c3p0.max_statements">0</prop>
            <prop key="c3p0.idle_test_period">3600</prop>
          </props>
        </property>
      </bean>
      
      
      <!-- Hibernate Transaction Manager Definition -->
      <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
        <property name="dataSource" ref="dataSourceCCR" />
      </bean>
      <tx:annotation-driven transaction-manager="transactionManager" mode="aspectj"/>
     
      <aop:config proxy-target-class="true"/>
      
    </beans>
    Mon GenericDaoImpl.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
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    package fr.cndp.ccr.core.dao;
     
    public abstract class GenericDAOImpl<T, K extends Serializable> implements GenericDAO<T, K> {
     
      protected static Logger logger;
     
      @Resource(name = "sessionFactory")
      private SessionFactory sessionFactory;
      private Session session;
     
     
      private Class type;
     
      public GenericDAOImpl(Class<T> leType) {
        type = leType;
        logger = Logger.getLogger(type);
      }
     
      /**
       * Permet de recuperer un T selon son id K
       * @param id
       * @return 
       */
      @Override
      public T find(K id) {
        return (T) getSession().get(type, id);
      }
     
      /**
       * Permet de recuperer la liste de tous les T
       * @return 
       */
      @Override
      public List<T> find() {
        Criteria crit = getSession().createCriteria(type);
        return crit.list();
      }
     
      /**
       * Permet de recuper un ensemble de T en fonction d'un T exemple
       * @param example
       * @return 
       */
     
      @Override
      public List<T> find(T example) {
        return null;
      }
     
      /**
       * Permet d'enregistrer en base un nouveau T
       * @param instance
       * @return 
       */
      @Override
      public K save(T instance) {
        K reponse = (K) getSession().save(instance);
        return reponse;
      }
     
      public Session getSession() {
     
        if (session == null) {
          try {
            session = sessionFactory.getCurrentSession();
          } catch (HibernateException e) {
             session = sessionFactory.openSession();
          }    
     
     
     
        }
       return this.session;
     
        //return SessionFactoryUtils.getSession(sessionFactory, allowCreate);
      }
     
      public void setSessionFactory(SessionFactory sessionFactory) {
        System.out.println("setSessionFactory : " + sessionFactory.toString());
        this.sessionFactory = sessionFactory;
      }
    }
    Mon implémentation du Dao RessourceImplDao.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Repository
    public class RessourceImplDao extends GenericDAOImpl<RessourceImpl, Integer> {
      public RessourceImplDao() {
        super(RessourceImpl.class);
      }
     
    }
    Mon service RessourceImpService.java que j'ai mis en Transactional, ce qui n'est visiblement pas suffisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    @Service
    @Transactional
    public class RessourceImplService {
     @Autowired
      private RessourceImplDao ressourceImplDao;
     
      public void enregistrerRessource(RessourceImpl r) {    
        ressourceImplDao.save(r);
      }
    }
    Merci d'avance pour toute aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut Transactions les données ne s'ajoutent pas
    Bonjour,
    spring ne fait pas de insert ou update qu'apres la fermuture de la ssesion donc tu dois utiliser les transactions avec aop
    mais il faut ajouter les jar dans votre lib (webinf/lib)
    aspectjrt.jar
    aspectjweaver.jar

  3. #3
    Membre averti
    Inscrit en
    Février 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 32
    Par défaut
    Bonjour,

    J'ai ajouté via maven les 2 librairies.
    On m'a aussi préconisé de ne pas ouvrir de session et de ne pas les stocker dans mon GenericDaoImpl, j'ai donc modifié de cette façon mon getSession() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      public Session getSession() {
       return sessionFactory.getCurrentSession();   
      }
    Mais désormais j'ai cette exception au premier appel de la base de mon action struts :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    org.hibernate.HibernateException: No Session found for current thread
    	org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
    	org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1024)
    	fr.cndp.ccr.core.dao.GenericDAOImpl.getSession(GenericDAOImpl.java:116)
    	fr.cndp.ccr.core.dao.UserImplDao.getUser(UserImplDao.java:30)
    	fr.cndp.ccr.core.service.UserImplService.getUser(UserImplService.java:49)
    	fr.cndp.ccr.catalogue.actions.IdentificationAction.identifier(IdentificationAction.java:44)
    	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	java.lang.reflect.Method.invoke(Method.java:597)
    	com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
    	com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
    	com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
    	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
    	org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
    	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
    	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:270)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
    	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    	org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    	org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498)
    	org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    	org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
    	com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
    	com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
    	org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:164)
    	org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141)
    	org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90)
    	org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:417)
    Voici mon web.xml :
    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
    52
    53
    54
    55
    56
    57
    58
     
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name>catalogue-cheque-ressources</display-name>
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
      </context-param>
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <!-- Si on utilise pas spring-mvc -->
      <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener
        </listener-class>
      </listener>
        <filter>
        <filter-name>openSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
        <init-param>
          <param-name>sessionFactoryBeanName</param-name>
          <param-value>sessionFactory</param-value>
        </init-param> 
      </filter>
      <filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>REQUEST</dispatcher>
      </filter-mapping>
      <session-config>
        <session-timeout>
                30
        </session-timeout>
      </session-config>
      <welcome-file-list>
        <welcome-file>redirect.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    et mon struts.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <struts>
    <!--  <constant name="struts.objectFactory" value="spring" />-->
      <constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
      <constant name="struts.devMode" value="true" />
      <package name="basicstruts2" extends="struts-default,json-default">
     
        <!-- CONNEXION/DECONNEXION -->
        <action name="identificationFormAction" class="fr.cndp.ccr.catalogue.actions.IdentificationAction" method="identifierForm">
          <result name="error">identification.jsp</result>      
          <result name="success">identification.jsp</result>
        </action>
    </struts>
    As tu une solution ?

  4. #4
    Membre averti
    Inscrit en
    Février 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 32
    Par défaut
    J'ai trouvé la solution,
    j'ai supprimé dans applicationContext-ccr-hibernate.xml <aop:config>:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      <!--<tx:annotation-driven transaction-manager="transactionManager" mode="aspectj"/>-->
      <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
     
      <!--<aop:config proxy-target-class="true"/>-->
    et j'ai ajouté via maven cglib
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        <dependency>
          <groupId>cglib</groupId>
          <artifactId>cglib</artifactId>
          <version>2.2.2</version>
        </dependency>

Discussions similaires

  1. Spring + Hibernate + JBoss : Transaction AOP
    Par meryodev dans le forum Wildfly/JBoss
    Réponses: 0
    Dernier message: 03/06/2011, 23h02
  2. [Data] Problème gestion transactions spring/hibernate
    Par Reno17 dans le forum Spring
    Réponses: 4
    Dernier message: 04/02/2010, 15h36
  3. [Framework] Challenge ! Spring + Hibernate = double transaction ?
    Par Invité dans le forum Spring
    Réponses: 2
    Dernier message: 22/10/2009, 10h19
  4. [Data] Problème de transaction Spring Hibernate
    Par totoz dans le forum Spring
    Réponses: 0
    Dernier message: 01/07/2009, 16h21
  5. [Spring][Hibernate] Transaction déclarative
    Par mauvais_karma dans le forum Hibernate
    Réponses: 13
    Dernier message: 03/07/2008, 17h09

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